Предположим, что мы работаем в арифметике с плавающей точкой, с удвоениями, в 64-битной машине. Я хотел бы найти максимальный показатель, для которого существует double a
с этим показателем, например, чтоМаксимальный показатель удвоений a, для которого (a - 0,0001) + 0,0001 не равен
(a - 0.0001) + 0.0001 == a
является ложным.
Я могу привести несколько примеров: a = 5.0e-14 является одним из них. В этом случае
(a - 0.0001) + 0.0001 = 5.0000002510715291e-14
Я работаю на C++, в случае, если это уместно. Компилятор gcc-4.8.4, без оптимизации.
Справочная информация: В части кода, которую я рассматривал, переменная была сначала сдвинута на 0,0001 для выполнения некоторых вычислений, а сдвинута вверх на 0,0001 с целью восстановления исходного значения. Это не правильный способ сделать это. В идеале я бы просто сохранил исходное значение и скопировал его обратно, вместо того, чтобы делать сдвиг взад и вперед. У разработчика есть надежда, что неассоциативность в плавающей точке не будет иметь никакого существенного эффекта для остальной части кода. Если все такие значения очень близки к 0.0, то это будет верно в нашем случае.
Частичный ответ: Положительные числа с показателем не более -5, то есть 1.0e-5, должны быть примерами.
Partial asnwer 2: 0.00022207040003564455 также является примером и имеет показатель -4.
Есть ли более крупные номера, которые также являются примерами?
Потому что 0,001 не является точно представимым как двоичное число с плавающей запятой, на этот вопрос не будет простой или элегантный ответ. Это особенно важно, потому что способ, которым вы написали свое уравнение, позволяет использовать компилятор в том, как/когда/если он округляет промежуточные значения. Я предлагаю вам дать больше информации о проблеме, которую вы пытаетесь решить. – Sneftel
@Sneftel Проблема точно такая же, как указано. Вопрос о 0,0001, который не является точно представимым, не имеет особого значения. Вы можете предположить, что я написал вместо 0.0001 базовое двоичное число. Просто это число, которое они имеют в коде. Какие аспекты, по вашему мнению, требуют более подробной информации? Версия компилятора? –
Как и в чем, что вам нужно, чтобы иметь возможность делать информацию? Список всех чисел, которые не удовлетворяют вашему уравнению, будет очень длинным, поэтому я не думаю, что это то, что вы ищете. – Sneftel