LINUX.ORG.RU

как целые в double конвернуть?


0

0

Чего-то торможу...

Есть знаковое целое i и беззнаковое целое f. По легенде i содержит целыю часть double, а f -- дробную, например, i=123; f=456; и мне надо получить 123.456

Надо это делать быстро, то есть через строку будет слишком накладно. Что-то мне ничего в голову не идет, кроме такого:

(double)i+f*pow(10,-((int)log10(f)+1))

Но как-то это тоже долго кажется...

Нет ли чего поумнее на этот счет?

★★★★★

Ответ на: комментарий от Miguel

ну, тогда придется генерить строку, а потом перегонять ее в число...

fizteh
()
Ответ на: комментарий от Miguel

:)

Ведущих нулей в дробной части нету.

Die-Hard ★★★★★
() автор топика

User-Agent: lynx + jed (x86_64-pc-asus-linux-glibc-perl-debian)

> Чего-то торможу...
>
> Есть знаковое целое i и беззнаковое целое f. По легенде i содержит
> целыю часть double, а f -- дробную, например, i=123; f=456; и мне надо
> получить 123.456

456 == 000456 == 00000456

0.456 != 0.000456 != 0.00000456

думаю, что значащие нули -- важная вещь и информация о том какой
именно знаменатель у дробной части (1/1000, тп) должна быть
предоставленна как дополнительный входной параметр.

> Надо это делать быстро, то есть через строку будет слишком накладно.
> Что-то мне ничего в голову не идет, кроме такого:
>
> (double)i+f*pow(10,-((int)log10(f)+1))

поэтому игры с логарифмами неуместны.

> Но как-то это тоже долго кажется...
>
> Нет ли чего поумнее на этот счет?

double d = i + f/denominator;

--
-o--=O`C
 #oo'L O
<___=E M

olecom
()

если точность после десятичной точки небольшая, то можно предварительно
вычислить дробные значения:

double arr[1000];
arr[0]=0;
for(f=1; f<1000; f++) arr[f]=f*pow(10,-((int)log10(f)+1));

(double)i + arr[f];

anonymous
()
Ответ на: комментарий от generatorglukoff

res /= 10 в цикле мне не совсем по душе...

В принципе, я придумал, как свою проблему решить -- просто мне длина строки в десятичном представлении дробной части известна, поэтому логарифм вычислять нет надобности (заодно проблема с ведущими нулями решается), а степень 10 тоже вычисляется "на лету" целыми умножениями.

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> ...можно предварительно вычислить дробные значения:

Гы! Хорошая идея, как раз подойдет: у меня довольно ограниченный набор возможных значений для дробной части, вполне поддается табуляции...

Die-Hard ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

>res /= 10 в цикле мне не совсем по душе...

итераций-то все равно больше 10 не будет. но если набор значений фиксирован, то можно попробовать и через него (обратная сторона медали - расход памяти).

generatorglukoff ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.