Мобильная версия форумов
Открыть
 −4°C
завтра: −2°C
Погода в Перми
−4°C
ночью−4°C
утром−4°C
завтра−2°C
Подробно
 65,86
−0.3454
Курс USD ЦБ РФна 21 февраля
65,8568
−0.3454
 74,68
−0.1335
Курс EUR ЦБ РФна 21 февраля
74,6816
−0.1335
  • activist

    Сообщений: 240

    -=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 и пр.?

  • v.i.p.

    Сообщений: 13508

    Что сделать то хотите?

  • activist

    Сообщений: 240

    А что с этим можно сделать?) Использовать BigDecimal, который в несколько сот раз медленнее или
    "думать" над каждой обработкой плавающих точек.
    Меня интересует другое: как с этим делом в других языках программирования.
    Почему, если переменная может хранить 3.6, то нельзя точно посчитать результат
    (точнее посчитать неточно, но округлить до нужного, точно нельзя из-за двоичной
    системы счисления) при перемножении 1.2 и 3?
    Я столько лет программирую и никогда не сталкивался с этим вплотную, точнее
    не обращал на это внимание.

  • рыжий котэ

    Сообщений: 12083

    проверять разность по модулю
    на значение <=0.00001 (к примеру)

    Осторожнее с травой!
    Если хапнешь много дряни
    Увезут тебя с собой
    Злые инопланетяне

  • veteran

    Сообщений: 1583

    В ответ на: Я столько лет программирую и никогда не сталкивался с этим вплотную, точнее
    не обращал на это внимание.
    Эх вот они современные программисты, нифига не знающие математических основ дискретных вычислений:улыб:

  • guru

    Сообщений: 5269

    > Меня интересует другое: как с этим делом в других языках программирования.

    Ни в одном языке не рекомендуется использовать проверку равенством для чисел с плавающей точкой.

  • activist

    Сообщений: 240

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

  • veteran

    Сообщений: 1104

    Без хвостов происходит только целочисленные вычисления. Учите матчасть.:улыб:

Записей на странице:

Перейти в форум

Модератор: