a == b, экспоненциальная запись.Октава странность? - PullRequest
2 голосов
/ 27 января 2012

Если я наберу это в октаве:

a = 8*10^-5;
b = 8.0e-005;
a==b

Я получаю ответ:

ans = 1

Но если я наберу это в октаве:

a = 3*10^-5;
b = 3.0e-005;
a==b

Я получаю этот ответ

ans = 0

Я что-то упустил? Разве это не правильный способ проверить на равенство?

Ответы [ 2 ]

3 голосов
/ 28 января 2012

Это результат потери точности во время вычислений с числами с плавающей запятой, например, в Java 3 * Math.pow(10, -5) даст вам «2.9999999999999997E-5», который больше не соответствует b во втором примере.Это связано с тем, как значения с плавающей запятой представляются и развиваются во время вычисления выражения.Для более сложных перспектив вы можете использовать в Google «потерю точности» с суффиксом, который используется в контексте / среде, которую вы используете для оценки этих выражений.Надеюсь, это поможет.

1 голос
/ 28 января 2012

Это распространенная проблема с представлением чисел с плавающей запятой в компьютерных системах.

Многие числа, которые являются «круглыми» в десятичной дроби, становятся повторяющимися дробями в двоичном представлении, используемом компьютером, и они должны быть усечены в некоторой точке для очень небольшой потери точности. Если два числа с плавающей точкой получаются по-разному, вы должны сравнить их с небольшим отклонением, например abs(a-b) < EPSILON, где EPSILON - соответствующая константа, подобная 1e-12.

...