LINUX.ORG.RU

проверил под perl и правда странный результат. Оч. интересно.

anonymous
()
Ответ на: комментарий от anonymous

Проверил на сях, на пяти разных машинах, под линухом и виндой - все одно и то же.

anonymous
()

Самое оригинальное, что там получается 3298,00000000 а после приведения типа получается 3297 :)

ArtSh ★★★
()

Если считать в double (java) получается 3297.999999, дробная часть отбрасывается при преобразовании в int.

Почему получается 3297.999999?

Как известно из математики чисел с плавающей точкой бесконечно много, а в машине это бесконечное множество представляется конечным числом бит. Поэтому представление приблизительное.

В данном конкретном случае при умножении разрядов для мантиссы нехватило видимо и единичка младшего разряда потерялась.

Процессор факт умножает не столбиком :)

Почему у всех одинаково? Так это все делается в конечном счете через одну и туже инструкцию процессора.

Интересно (ради развлечения) посмотреть на результат на архитектурах отличных от x86 и её 64-bit версий.

guardian
()
Ответ на: комментарий от anonymous

если запустить следующую програмку на С++

#include <iostream>

using namespace std;

int main(void)
{
    float f;
    double d;
    long double ld;

    ld=32.98;
    d=32.98;
    f=32.98;

    cout<<"  ld: "<<ld*100<<"  d: "<<d*100<<"   f: "<<f*100<<endl;
    cout<<"INT:  ld: "<<(int)(ld*100)<<"  d: "<<(int)(d*100)<<"   f: "<<(int)(f*100)<<endl;
    cout<<endl;

    return 0;

}

то результат будет таким:

  ld: 3298  d: 3298   f: 3298
INT:  ld: 3297  d: 3297   f: 3298

ArtSh ★★★
()
Ответ на: комментарий от ArtSh

echo 32.98*100 | bc

А как bc сказать, чтобы он в целое преобразовал?

Lumi ★★★★★
()

> результат: 3297 - с чем связано ?

это не результат ни разу, это быдлорезультат. Вот как нужно:

[1]> (truncate (* 32.98 100))
3298 ;
0.0

bugmaker ★★★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.