Size: a a a

2020 May 18

a

allter in Modern::Perl
Anton Petrusevich
в общем, это довольно специальный случай. блин, я не помню таки что за трабла с даблами у меня была...
Переполнение мантиссы м.б.? при хранении цифр в форматах с плавающей точкой, надо убеждаться, что ни переполнения мантиссы не происходит при арифметических операциях, ни обрезка битов не приводит к "неправильным" округлениям.
источник

AP

Anton Petrusevich in Modern::Perl
allter
Переполнение мантиссы м.б.? при хранении цифр в форматах с плавающей точкой, надо убеждаться, что ни переполнения мантиссы не происходит при арифметических операциях, ни обрезка битов не приводит к "неправильным" округлениям.
ну посмотри как происходит енкодинг джейсона в жс и перле
источник

a

allter in Modern::Perl
Anton Petrusevich
ну посмотри как происходит енкодинг джейсона в жс и перле
Да вроде одинаково в современных либах. Но про старые реализации в стандарте ascii по файлу чётко написано ничего не ожидать от JSON Number.
источник

AP

Anton Petrusevich in Modern::Perl
allter
Да вроде одинаково в современных либах. Но про старые реализации в стандарте ascii по файлу чётко написано ничего не ожидать от JSON Number.
я привёл примеры
источник

AP

Anton Petrusevich in Modern::Perl
не совсем одинаково
источник

a

allter in Modern::Perl
Anton Petrusevich
хм. хотя может я и не совсем прав:
$ perl -MJSON -E '$l = 99999999999.0123 + 0.00231432423; say encode_json({l=> $l})'
{"l":99999999999.0146}
Вот это vs простой "+" и print? Ну, это вопрос к указанному модулю. Не надо передавать числа в JSON как Number, если важна точность.
источник

AP

Anton Petrusevich in Modern::Perl
allter
Вот это vs простой "+" и print? Ну, это вопрос к указанному модулю. Не надо передавать числа в JSON как Number, если важна точность.
я привёл джсон-стрингификацию джаваскрипта и перла для одного и того же значения. стрингификация разная.
источник

YS

Yevhen Sabodash in Modern::Perl
Yevhen Sabodash
а не подскажите как различить 1 и "1"? как достать внутренний флаг, чтоб знать что передо мной именно строка?
помимо махинации с xor, проверить флаг можно
B::svref_2object(\$x)->POK
источник

VG

Vadim Goncharov in Modern::Perl
Yevhen Sabodash
дело не в жс
perl -le 'print 1234567890.123456;'
1234567890.12346
perl -E 'say sprintf "%.9f", 1234567890.123456;'
1234567890.123456001
источник

VG

Vadim Goncharov in Modern::Perl
allter
Кстати, если вам надо валидировать JSON, то по стандарту никто ни double ни int64 не гарантирует.
а что гарантируют?
источник

VG

Vadim Goncharov in Modern::Perl
Yevhen Sabodash
помимо махинации с xor, проверить флаг можно
B::svref_2object(\$x)->POK
он и после использования числа в строковом контексте появится, например после print
источник

YS

Yevhen Sabodash in Modern::Perl
да, это я знаю
источник

YS

Yevhen Sabodash in Modern::Perl
покрыл тестами эти костыли
источник

a

allter in Modern::Perl
Vadim Goncharov
а что гарантируют?
что строки будут переданы как есть.  :)
источник

YS

Yevhen Sabodash in Modern::Perl
Vadim Goncharov
perl -E 'say sprintf "%.9f", 1234567890.123456;'
1234567890.123456001
точность все-равно теряется, то есть все-равно упираемся в дабл. я подозреваю,что появление цифр сверх точности связано с тем, как на самом деле хранится представление того, что после запятой. Так как для целых чисел там останется 0
perl -E 'say sprintf "%.9f", 1234567890123456.987654321;'
1234567890123457.000000000
источник

YS

Yevhen Sabodash in Modern::Perl
точнее когда предел точности не доходит до дробной части
источник

VG

Vadim Goncharov in Modern::Perl
perl -E 'say sprintf "%18.9f", 2**59'
576460752303423488.000000000

еще влезает
источник

VG

Vadim Goncharov in Modern::Perl
хотя, это в десятичном виде, младшие биты там уже нулевые поди
источник

YS

Yevhen Sabodash in Modern::Perl
2^53, если верить википедии и мы говорим про double на 8 байт
источник

AT

Artem Tepponen in Modern::Perl
Проблема в том, что 0.1 во флоате - бесконечная дробь. Независимо от языка.
источник