[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.46971 Reply
File: preds.gif
Gif, 21.70 KB, 577×647 - Click the image to expand
edit Find source with google Find source with iqdb
preds.gif
Здесь будет мой дневничок, посвященный написанию сабжа с помощью рациональных чисел из библиотеки GNU MP/MPIR.

Тем кто хочет ознакомиться с темой добро пожаловать сюда:
https://habrahabr.ru/post/138168/
Или на видео этого же чувака:
https://www.youtube.com/watch?v=ndimHVTnUMA

Т.к. у меня уже почти атрофировались все навыки написания программ, то попутно я буду вспоминать си.
>> No.46972 Reply
Особый кайф этой библиотеки состоит в том, что я не смог найти даже примитивных туториалов для даунов или популярных книг для чайников. Придется читать чертову документацию страницу за страницей.
>> No.46973 Reply
Сделал тестовый cmake-скрипт, все собралось, можно приступать к ковырянию БЛЯ ЩА НА ДЕЛО ПОЙДЕМ, ОТВЕЧАЮ ТАКИЕ ТЕМЫ МУТИТЬ БУДЕМ, УХ ЧТО СЕЙЧАС НАЧНЕТСЯ, ВНАТУРЕ ДВИЖУХА ЩА БУДЕТ
>> No.46974 Reply
Первая работающая программа.

Как вы думаете сколько будет 0.23414*12.21736 в форме рационального числа?
Правильный ответ:
7252413325258057258250800212775/2535301200456458802993406410752

Офигительно.
>> No.46975 Reply
File: d01.PNG
Png, 53.58 KB, 761×624
edit Find source with google Find source with iqdb
d01.PNG
File: d02.PNG
Png, 55.36 KB, 807×634
edit Find source with google Find source with iqdb
d02.PNG

>>46974
Немного неправильно написал. На самом деле это был не результат умножения этих чисел, а их конверсий в тип double. Если не конвертировать, то там другой результат был бы. Но у меня в программе входные данные будут в даблах -- так что это именно то что мне нужно.
>> No.46976 Reply
>>46974
Чистые фракции будут 1787857919/625000000.

На этом закончу и отправлюсь спать.
>> No.46983 Reply
Тем временем я реализовал этот предикат. По мере реализации стала очевидна потребность в написании более общего транслятора арифметических выражений из обычной формы в форму GMP-функций. Наверное, кто-то где-то уже это писал. Для SAGE или Mathematica. Может быть есть даже попен-сорс.
>> No.46984 Reply
File: test.PNG
Png, 13.27 KB, 767×460 - Click the image to expand
edit Find source with google Find source with iqdb
test.PNG
Тест на адекватность алгоритма пройден четенько.
>> No.46991 Reply
Сейчас затестирую два старых алгоритма, которые у меня стояли до этого. И посмотрю на результаты. А потом попробую их объеденить, чтобы новый работал только в самом узком месте.
>> No.47005 Reply
Не очень понял (если вообще что-то понял), как оно получает корректный результат из уже некорректных вводных флоатов, но вангую, что всё равно всё сделано через егоры с терпимостями.
>> No.47015 Reply
>>47005
> как оно получает корректный результат из уже некорректных вводных флоатов
Верно подметил, что сами входные данные потенциально некорректны. И чем больше с ними совершено операций, пока они находятся внутри типа float -- тем более некорректны они становятся.

Однако, если не делать вышеописанных процедур, то количество мест в программе, где происходит какая-то дичь будет только множиться. Это устранение одной из головных болей.
>> No.47017 Reply
>>47015
Вроде что-то понял. Инпуты некорректны, но вычисления над ними не будут наращивать эту некорректность, так? Минус, полагаю, в производительности.
>> No.47022 Reply
Теперь это будет тред 754 стандарта. Настало время его наконец-то прочитать.

Видео для интересующихся:
https://www.youtube.com/watch?v=K5Y4-4SKaSA
>> No.47025 Reply
Интересная статья по теме:
https://habrahabr.ru/post/258483/

Стандарт читается очень тяжело. Т.к. написан казенным языком. Нужно крепко помолиться, чтобы продвинуться на новую страницу.
>> No.47027 Reply
Отличная статья:
http://smalltalk.gnu.org/blog/bonzinip/floating-point-decimal-conversion-not-so-easy

Наконец-то стало понятно почему программы по печати float'ов могут напечатать разное для одного и того же числа.
>> No.47035 Reply
File: nextafter.PNG
Png, 25.96 KB, 716×224 - Click the image to expand
edit Find source with google Find source with iqdb
nextafter.PNG
Посоны, посоветуйте свободную библиотеку, где есть аналог этого:
http://www.digitalmars.com/rtl/math.html#nextafter
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.bpxbd00/rnextf.htm
http://en.cppreference.com/w/c/numeric/math/nextafter
https://opensource.apple.com/source/Libm/Libm-47/ppc.subproj/nextafter.c

Чтобы работало для binary32 float (одинарной точности) под intel. В той версии студии, что у меня есть (и изменить ее я не могу) этой функции нет. И писать самому мне ее очень не хочется.
>> No.47036 Reply
Офигеть. В Apple пишут в новой версии libm пишут код сразу в ассемблере:
https://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/nextafterf.s.auto.html
>> No.47037 Reply
File: printf.PNG
Png, 42.34 KB, 749×728 - Click the image to expand
edit Find source with google Find source with iqdb
printf.PNG
Блин. Походу у майкрософт сломанный printf в части печати float. Он слишком рано округляет, хотя его этого делать не просили. Еще с этим теперь разбираться.
>> No.47038 Reply
File: 17.PNG
Png, 15.60 KB, 778×146 - Click the image to expand
edit Find source with google Find source with iqdb
17.PNG
>>47037
Так и есть.
> The VC++ CRT, regrettably, refuses to print floats or doubles with more than 17 digits of mantissa. 17 digits is enough to uniquely identify any float or double, but it is not enough to tell us precisely what value they contain.
>> No.47049 Reply
>>47035
В glibc есть
>> No.47058 Reply
>>47038
> Так и есть.
> The VC++ CRT, regrettably, refuses to print floats or doubles with more than 17 digits of mantissa. 17 digits is enough to uniquely identify any float or double, but it is not enough to tell us precisely what value they contain.
не вполне так.
хотя это вопрос, в некотором смысле, философский.
вкратце, нет оснований думать, будто float or double "содержит" некоторое конкретное значение сверх того, которое его однозначно идентифицирует.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]