2015-06-11 2 views
2

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

Например предполагающей х этого число с плавающей точкой, и мы хотим, чтобы разделить это в х = I + е, где I является подписанной целой частью, а е является подписанной дробной частью, как плавающее число, я предполагаю, что такой раскол может быть реализован точно (т.е. без ошибки fp, которую я имею в виду).

Мне было интересно, можно ли как-то разбить x = (I-1.0) + (f + 1.0), а именно без ошибки округления с плавающей точкой.

Я сам реализовал раскол x = I + f, а затем суммируя и добавляя 1.0, у меня есть второй раздел, который я представил, но в основном это связано с ошибкой округления с плавающей запятой такой операции.

ответ

6

(с использованием двойной точности для примеров)

было интересно, если можно разделить как-то х = (I-1.0) + (F + 1,0), а именно без плавающей ошибки округления точки.

Невозможно получить такой раскол для всех значений. Возьмите 0x1.0p-60, неотъемлемой частью которого является 0.0, а дробная часть - 0x1.0p-60. f + 1.0 неточной и производит 1.0, тогда как I-1.0 является точной и производит -1.0.

Это не только то, что добавление в f + 1.0 неточно: значение с плавающей запятой, которое при добавлении -1.0 производит 0x1.0p-60, не существует.

Значение с плавающей точкой v всегда можно разделить именно на сумму fmod(v, 1.0) и v - fmod(v, 1.0), где последний вл етс целым числом, и есть по крайней мере, еще один способ разделить v точно между целой части и дробной части, используя IEEE 754 “Floating-point remainder”, который тонко отличается от fmod, но нет возможности разбить числа, близкие к 0, на сумму с плавающей запятой 1.0 и другое значение.

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