Реализовать удвоения с помощью поплавков - PullRequest
0 голосов
/ 28 ноября 2010

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

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

Ответы [ 2 ]

3 голосов
/ 28 ноября 2010

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

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

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

2 голосов
/ 28 ноября 2010

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

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

...