Точность точки
2558
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 и пр.?
Сибиряк
А что с этим можно сделать?) Использовать BigDecimal, который в несколько сот раз медленнее или
"думать" над каждой обработкой плавающих точек.
Меня интересует другое: как с этим делом в других языках программирования.
Почему, если переменная может хранить 3.6, то нельзя точно посчитать результат
(точнее посчитать неточно, но округлить до нужного, точно нельзя из-за двоичной
системы счисления) при перемножении 1.2 и 3?
Я столько лет программирую и никогда не сталкивался с этим вплотную, точнее
не обращал на это внимание.
RealWega
проверять разность по модулю
на значение <=0.00001 (к примеру)
RealWega
Я столько лет программирую и никогда не сталкивался с этим вплотную, точнее
не обращал на это внимание.
Эх вот они современные программисты, нифига не знающие математических основ дискретных вычислений:улыб:
RealWega
> Меня интересует другое: как с этим делом в других языках программирования.

Ни в одном языке не рекомендуется использовать проверку равенством для чисел с плавающей точкой.
CoolUser
Ну вот, обидели ни за что ни про что. Ну при чём здесь основы? Сможете без проблем сходу перемножить дроби в двоичной системе никуда не заглядывая и объяснить, почему нельзя округлять до "точного" результата (там +- 1 бит), постоянно программируя на языке высокого уровня - респект и уважуха. Я пока не могу, ибо в последний раз дроби видел лет 6 назад и то теории ради - нет задач. Тем более во многих языках это скрыто. То что не всегда можно получить точный результат для дробей, оперируя битами - я знаю.
Только что посмотрел: в Си и в Бейсике при выводе проблема "умалчивается" (чтобы увидеть неточность надо приложить усилия). Почему-то из всех языков припоминаю только Фортран - там эта проблема всплыла явно при выводе, но установленного нету, а искать - лень.
Вот и возник вопрос, есть ли среды, где происходит округление неточного результата, если при операциях получить точное
число нельзя. Пока получилось, что Си, Бэйсик идут в направлении округления в представлении, Джава, Фортран - нет.
Мне единственное было интересно, есть ли язык/платформа, где работа с плавающей точкой организована иначе и предпринимаются какие-то меры
для повышения точности. В Джава можно получать точные значения, используя BigDecimal. А где это "встроено" в платформу?
RealWega
Без хвостов происходит только целочисленные вычисления. Учите матчасть.:улыб: