Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Особенности вычисления в JS (https://javascript.ru/forum/misc/73240-osobennosti-vychisleniya-v-js.html)

DmitryOpalev 31.03.2018 19:56

Особенности вычисления в JS
 
Нашел скрипт для вычисления определителя матрицы: http://mathhelpplanet.com/static.php...nad-matritsami
Нужно вычислить определитель такой матрицы:

var M = new Array();
M[0] = new Array(-2.3128860264714093, -1.1564430132357046, 0, 254.417462911855);
M[1] = new Array(-1.1564430132357046, -2.3128860264714097, 254.417462911855, -9.769962616701378*Math.pow(0.1,14));
M[2] = new Array(10.876222279050648, -5.572421139525324, 59.09640000000007, -3559.6051520867136);
M[3] = new Array(-5.572421139525324, 10.876222279050648, -3559.6051520867136, 59.09640000000007);

При этом скрипт на JS возвращает -0, а маткад конкретное число:

Причем если из элемента 2 строки 4 столбца убрать 10^(-14), то результаты, можно сказать, совпадают:

В чем проблема и как ее решить?

j0hnik 31.03.2018 20:28

https://www.youtube.com/watch?v=0VbK_WPgZmQ
тут все по полочкам.

DmitryOpalev 31.03.2018 21:40

j0hnik,
Понятно. У этой проблемы есть общеизвестное решение? Нагуглил длинную арифметику, но мне для этого придется все арифметические операции переписывать, может есть что-то поэлегантнее?

brizing 01.04.2018 15:17

Можно подключить библиотеку http://jsfromhell.com/classes/bignumber
С помощью gulp-replace можно кодить в файле operations.js, затем компилировать автоматически файл operations.bignumber.js.

Что собой должна представлять автоматическая компиляция:
в файле operations.js искать строки типа 1-2 и заменять на '1'.subtract('2')

Примерно так:
"-1.55-1".replace(/(-?\d+(?:\.\d+)?)-(-?\d+(?:\.\d+)?)/g, "'$1'.subtract('$2')")

DmitryOpalev 01.04.2018 18:36

brizing,
Спасибо за разъяснения


Часовой пояс GMT +3, время: 05:51.