Итак, я пытаюсь выяснить, почему оператор modulo возвращает такое большое необычное значение.Арифметика с плавающей точкой - Оператор Modulo по двойному типу
Если у меня есть код:
double result = 1.0d % 0.1d;
это даст результат 0.09999999999999995
. Я ожидал бы значение 0
Примечания этой проблема не существует с помощью оператора разделительного - double result = 1.0d/0.1d;
даст результат из 10.0
, а это означает, что остаток должен быть0
.
Позвольте мне быть ясным: я не удивлен, что существует ошибка, я удивлен, что ошибка настолько черная большая по сравнению с цифрами при игре. 0,0999 ~ = 0,1 и 0,1 находится на том же порядке, что и 0.1d
, и только на один порядок величины от 1.0d
. Его не так, как вы можете сравнить его с double.epsilon, или сказать «его равный, если его < 0,00001 разница».
Я прочитал эту тему на StackOverflow в следующих должностях onetwothree, среди прочих.
Может кто-нибудь предложить объяснить, почему эта ошибка настолько велика? Любые любые предложения, чтобы избежать столкновения с проблемами в будущем (я знаю, что я мог бы использовать десятичный код вместо этого, но меня беспокоит его производительность).
Редактировать: Я должен указать, что я знаю, что 0,1 является infinitely repeating series of numbers in binary - это имеет к этому какое-либо отношение?
0.1000000000000000055511151231257827021181583404541015625, а точнее. – dan04
Я ценю прогулку по расчету. Одно уточнение - вы упоминаете «с 0 = 0,1 mod 0,1, фактическая ошибка в мод составляет 0,1 - 0,09999999 ... - очень мало». Я смущен этим, потому что мой результат вернулся 0.099999, но фактический результат равен 0. Как фактическая ошибка 0.1 - 0.099999? Вы можете немного рассказать об ошибке в этой части? – CrimsonX
, чтобы ответить на предыдущий комментарий для будущих читателей: раздел «Редактировать» отвечает на него. (короткое объяснение: ошибка велика из-за нестабильности мод (функция вмятины пилы) небольшое увеличение 'a' (например, 10,0001) приведет к падению результата до около 0) –