Точность точки
2625
7
-=Java=-
double a = 3.6d;
double b = 1.2d * 3d;
assertEquals(a, b);
Результат:
junit.framework.AssertionFailedError: expected:<3.6> but was:<3.5999999999999996>
Как с этим в других языках программирования?
Паскаль, С, С#, Basic, Asm и пр.?
double a = 3.6d;
double b = 1.2d * 3d;
assertEquals(a, b);
Результат:
junit.framework.AssertionFailedError: expected:<3.6> but was:<3.5999999999999996>
Как с этим в других языках программирования?
Паскаль, С, С#, Basic, Asm и пр.?
А что с этим можно сделать?) Использовать BigDecimal, который в несколько сот раз медленнее или
"думать" над каждой обработкой плавающих точек.
Меня интересует другое: как с этим делом в других языках программирования.
Почему, если переменная может хранить 3.6, то нельзя точно посчитать результат
(точнее посчитать неточно, но округлить до нужного, точно нельзя из-за двоичной
системы счисления) при перемножении 1.2 и 3?
Я столько лет программирую и никогда не сталкивался с этим вплотную, точнее
не обращал на это внимание.
"думать" над каждой обработкой плавающих точек.
Меня интересует другое: как с этим делом в других языках программирования.
Почему, если переменная может хранить 3.6, то нельзя точно посчитать результат
(точнее посчитать неточно, но округлить до нужного, точно нельзя из-за двоичной
системы счисления) при перемножении 1.2 и 3?
Я столько лет программирую и никогда не сталкивался с этим вплотную, точнее
не обращал на это внимание.
проверять разность по модулю
на значение <=0.00001 (к примеру)
на значение <=0.00001 (к примеру)
Я столько лет программирую и никогда не сталкивался с этим вплотную, точнееЭх вот они современные программисты, нифига не знающие математических основ дискретных вычислений
не обращал на это внимание.
> Меня интересует другое: как с этим делом в других языках программирования.
Ни в одном языке не рекомендуется использовать проверку равенством для чисел с плавающей точкой.
Ни в одном языке не рекомендуется использовать проверку равенством для чисел с плавающей точкой.
Ну вот, обидели ни за что ни про что. Ну при чём здесь основы? Сможете без проблем сходу перемножить дроби в двоичной системе никуда не заглядывая и объяснить, почему нельзя округлять до "точного" результата (там +- 1 бит), постоянно программируя на языке высокого уровня - респект и уважуха. Я пока не могу, ибо в последний раз дроби видел лет 6 назад и то теории ради - нет задач. Тем более во многих языках это скрыто. То что не всегда можно получить точный результат для дробей, оперируя битами - я знаю.
Только что посмотрел: в Си и в Бейсике при выводе проблема "умалчивается" (чтобы увидеть неточность надо приложить усилия). Почему-то из всех языков припоминаю только Фортран - там эта проблема всплыла явно при выводе, но установленного нету, а искать - лень.
Вот и возник вопрос, есть ли среды, где происходит округление неточного результата, если при операциях получить точное
число нельзя. Пока получилось, что Си, Бэйсик идут в направлении округления в представлении, Джава, Фортран - нет.
Мне единственное было интересно, есть ли язык/платформа, где работа с плавающей точкой организована иначе и предпринимаются какие-то меры
для повышения точности. В Джава можно получать точные значения, используя BigDecimal. А где это "встроено" в платформу?
Только что посмотрел: в Си и в Бейсике при выводе проблема "умалчивается" (чтобы увидеть неточность надо приложить усилия). Почему-то из всех языков припоминаю только Фортран - там эта проблема всплыла явно при выводе, но установленного нету, а искать - лень.
Вот и возник вопрос, есть ли среды, где происходит округление неточного результата, если при операциях получить точное
число нельзя. Пока получилось, что Си, Бэйсик идут в направлении округления в представлении, Джава, Фортран - нет.
Мне единственное было интересно, есть ли язык/платформа, где работа с плавающей точкой организована иначе и предпринимаются какие-то меры
для повышения точности. В Джава можно получать точные значения, используя BigDecimal. А где это "встроено" в платформу?
Сейчас читают
красота и материнство (часть 18)
155207
1000
Платяной шкаф. Прочтение правил - ОБЯЗАТЕЛЬНО (часть 17)
255535
1000
О новичках
35847
247
Без хвостов происходит только целочисленные вычисления. Учите матчасть.