Округление до ближайшего низкоуровневого внедрения - PullRequest
0 голосов
/ 07 мая 2011

У меня есть вопрос низкого уровня:
Давайте предположим, что у нас есть десятичное число 0,1 (мы можем представить это очень точно, написав 1/10 - но это не решение).Преобразованный в двоичное число, это дает нам 0,00011 с последними 4 цифрами, бесконечно повторяющимися (0,0001100110011 ....).

Итак, теперь предположим, что мы хотим поместить это число в представление с плавающей запятой,например, IEEE 754 с одинарной точностью, и мы хотим округлить ее так, чтобы ближайшее возможное представление дало нам
1 0111 1110 0101 0101 0101 0101 0101 011
(fyi: последняя цифра должна быть 0 вместо 1если бы мы просто обрезали)

Теперь мой вопрос: как добиться этого в программном обеспечении?В конце концов, мы не можем просто использовать некоторые
x = ((x_floor-0.1) <(x_ceil-0.1))? X_floor: x_ceil; <br>, поскольку это будет означать «идеальный» 0.1, который является ядром моегопроблема.Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2011

Я думаю, что у меня есть некоторый ответ на мой собственный вопрос: вы можете решить, проверив следующую часть разговора.Если это будет установлено, вы можете округлить до предела, потому что посмотрите на следующий пример: мы хотим округлить двоичное число от 0,1001 до 3 цифр после точки.если мы округлим его до 0,100, мы сделаем ошибку 0,0001, а также в случае округления до 0,101.

Но еще интереснее: если число для округления равно 0,1001 ... 1 - ошибка, которую мы допустим, если мы округлим до 0,100, будет больше, чем ошибка при округлении до 0,101 в любом случае!Это «доказательство» может быть сделано аналогичным образом для случая, когда бит установлен после фактического разговора

...