Умножение двух чисел в форме x.xxxxxxe-x * 10 ^ xx не работает должным образом - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь оценить следующий пример внутри моего кода, но получаю неправильный ответ:

julia> -1.259237254330301e-29*10^29 
-9.930838679817422e-11

Ответ явно неверный, ожидается -1,259237254330301.Я получил правильный ответ по

julia> -1.259237254330301e-29*1e29
-1.2592372543303008

кто-нибудь знает причину?

1 Ответ

0 голосов
/ 13 июня 2018

Несмотря на ошибки округления чисел с плавающей точкой, причина неправильного результата связана с использованием целочисленной арифметики с переполнением в типе: В 64-разрядной ОС 10 ^ 29 переполнений (в JULIA без ошибок).

64-Bit OS: 10^18 =  = 1000000000000000000  (64-Bit Integers can hold up to ~ 9,22x10^18)

while: 10^19 turns to: -8446744073709551616 which is wrong, due to overflowing.

Если вы выберете тип capabale для хранения значения, результат будет правильным: например:

julia> -1.259237254330301e-29*Int128(10)^29
-1.2592372543303008

или:

julia> -1.259237254330301e-29*big(10)^29
-1.259237254330300936796903330938514872571882315563023692882767533667837970629477
...