Russian Qt Forum

Программирование => Алгоритмы => Тема начата: zedalert от Ноябрь 26, 2010, 10:20



Название: Перевод текста из любой системы исчислений в десятичную
Отправлено: zedalert от Ноябрь 26, 2010, 10:20
Написал небольшую прогу-калькулятор, переводит из любой системы исчисления в любую (от 2- до 36-ричной). Пока все работало в режиме Отладки ошибок не было, перевел в режим Релиз - программа ошибается на сложении двух целых чисел и ошибается на единицу. Вот участок кода, который ошибается:

Код
C++ (Qt)
#include "qmath.h"
 
...
 
QString numeral = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
QString t = "883";
int v = 10;
int decValue = 0;
int len = t.length();
for (int j = 0; j < len; j++)
{
decValue += numeral.indexOf(t.right(1)) * pow(v, j);
t.chop(1);
}
 
В каждом цикле число считается верно: сначала 3, потом 80, потом 800, но все это дело складывается в 882. В чем загвоздка?  ??? Грешу конечно на pow(), все-таки она вся на double работает, но число то все равно ничего не имеет после запятой кроме нулей, откуда же такая колоссальная погрешность, и почему она проявляется именно в Релиз версии...


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: zedalert от Ноябрь 26, 2010, 11:36
Да, все-таки проблема в pow(), решилось через floor(pow()) видимо где-то в недрах программа считает 100 как 0.999999999 и режет все после запятой, а не ровно 1.


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: Denjs от Ноябрь 26, 2010, 13:36
На самом деле хорошая штука для того что бы набить руку, но в Qt уже есть перевод чисел из различных систем исчисления в число и обратно.
Кажется на базе QString.


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: zedalert от Ноябрь 26, 2010, 14:11
Да, я привык что в PHP5 все приводится автоматом, а тут просто странным показалось, что именно в Debug режиме все работает как надо, а в Release - нет. Перевод есть, но только между базовыми системами, а вот скажем 5- или 7-ричных систем конечно нет. :)


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: BRE от Ноябрь 26, 2010, 14:33
Перевод есть, но только между базовыми системами, а вот скажем 5- или 7-ричных систем конечно нет. :)
QString QString::number ( long n, int base = 10 ) [static]
Returns a string equivalent of the number n according to the specified base.
The base is 10 by default and must be between 2 and 36. For bases other than 10, n is treated as an unsigned integer.


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: zedalert от Ноябрь 26, 2010, 16:09
Так это обратная моей функция. Тут тогда уж нужна toInt(), но своими руками все же интереснее. :)


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: BRE от Ноябрь 26, 2010, 17:37
Так это обратная моей функция. Тут тогда уж нужна toInt(), но своими руками все же интереснее. :)
Конечно интересней, я комментировал это:
Перевод есть, но только между базовыми системами, а вот скажем 5- или 7-ричных систем конечно нет. :)


Название: Re: Перевод текста из любой системы исчислений в десятичную
Отправлено: Denjs от Ноябрь 26, 2010, 19:35
Так это обратная моей функция. Тут тогда уж нужна toInt(), но своими руками все же интереснее. :)
Обратное тоже есть. Не помнюя что бы хекс-дампы руками в десятичку преобразовывал.

Но насчет руками интереснее - это верно. Это базовые алгоритмы которые все должны понимать как работают.