2010-11-28 3 views
0

Предположим, что я в среде, у которой только тип float (скажем) 32 бита в ширину, и я хочу сделать некоторые вычисления с 64-битными поплавками.Реализовать дублирование с помощью поплавков?

Есть ли разумный/эффективный/допустимый способ использования типа данных float32 для реализации более широкого типа данных с плавающей запятой, такого как float64? (Или даже float63, или float48, или что-нибудь более широкое, чем 32 у меня есть?)

Или мне лучше всего использовать только более длинные типы данных с плавающей точкой, используя целые числа?

Я предполагаю, что конкретные значения местоположений бит будут делать это в принципе невозможным, но я не эксперт в области численных расчетов, и я не знаю, как это искать, так что, возможно, есть умный подход ,

ответ

3

Есть трюки, которые вы можете использовать, чтобы получить больше точности, чем ваша машина хочет вам дать. Одним из наиболее известных является суммирование алгоритмом Кагана для получения дополнительной точности при вычислении суммы набора чисел с плавающей запятой:

http://en.wikipedia.org/wiki/Kahan_summation_algorithm

Проектирования такой процедуры требует достаточно детального знания внутренней работы с плавающей точкой вычислений, поэтому будьте осторожны.

2

Я думаю, что ваша догадка верна. Можно попытаться представить 64-битный float как продукт двух 32-битных поплавков, но я не думаю, что вы могли одновременно работать как экспонента, так и мантисса. Это может быть можно получить что-то вроде float48 как чистый эффект, но это кажется довольно хитростью в целом.

Но там должны быть библиотеки для этого с помощью ints. Это не так давно, что обычно используемые процессоры не поддерживали поддержку флота.

Смежные вопросы