none
Баг с проверкой остатка от десятичной дроби типа double в Visual Studio. RRS feed

  • Общие обсуждения

  • Решил на писать небольшую математическую библиотеку и обнаружил баг с получением остатка от десятичной дроби.
    Как известно чтобы получить: числител_дробный_части(остаток от дроби)=десятичная_дробь - целая_часть_числа
    И тут выяснилось что компилятор приписывает или вычитает очень, очень маленькое число такое что при округлении это незаметно но воспользовавшись методом Console.WriteLine("Дробная часть числа: {0}",g.Дробная_часть); //для дробной часть видно что приписка существует.  
    исходники могу  выложить.

    Майкрасофт залатает эту ошибку с типом double или мне для точных вычислений писать свой тип данных?

    Фото :

    http://yadi.sk/d/WwKqp3b91Ecy4


    • Изменено Koln1 14 декабря 2012 г. 22:59
    14 декабря 2012 г. 22:30

Все ответы

  • Числа double это двоичные числа с плавающей запятой конечной точности, поэтому числа, которые в двоичной системе счисления записываются в виде бесконечной периодичной дроби, просто не могут быть точно представлены в этом типе. Microsoft не занимается утверждением подобных стандартов, по этому сделать что-либо по этому поводу не в состоянии. Более того, точно какое же поведение Вы получите на любом другом языке программирования при использовании стандартных двоичных чисел с плавающей точкой.

    P.S.
    В C# есть тип decimal (System.Decimal), который возможно Вам подойдёт.

    15 декабря 2012 г. 6:57
  • только он помедленее работает и занимает 16 байт вроде бы

    или 32 даже наверное.
    не интересовался особо.

    Да, и можно в крайнем случае использовать целочисленные типы.
    например 2 простых целых 4-хбайтовых числа.
    одно для целой части дробного числа, другое для дробной.
    ну это всё ерунда, наверное decimal хватит,
    если он, конечно обеспечивает точность.


    и вот, на сколько я помню, не точность типов с плавающей точкой это не майкрософтовская фича,
    а процессора (ну или как оно хранится в памяти).
    могу конечно ошибаться,
    но вот.

    почему так?, не знаю (ну или не помню чего там в ВУЗе говорили), ну может из соображений производительности.

    • Изменено INFEL8 17 декабря 2012 г. 7:13 Добавка, про хранение в памяти
    15 декабря 2012 г. 8:33
  • Не помешает ознакомиться с теорией Число с плавающей запятой
    17 декабря 2012 г. 7:10