Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2012, 03:20   #1
koln1
Новичок
Джуниор
 
Регистрация: 15.12.2012
Сообщений: 2
По умолчанию Баг с проверкой остатка от десятичной дроби типа double в Visual Studio.

Решил на писать небольшую математическую библиотеку и обнаружил баг с получением остатка от десятичной дроби.
Как известно чтобы получить: числител_дробный_части(остаток от дроби)=десятичная_дробь - целая_часть_числа
И тут выяснилось что компилятор приписывает или вычитает очень, очень маленькое число такое что при округлении это незаметно но воспользовавшись методом Console.WriteLine("Дробная часть числа: {0}",g.Дробная_часть); //для дробной часть видно что приписка существует.
исходники могу выложить.
http://yadi.sk/d/WwKqp3b91Ecy4
Может быть в простых вычислениях это не играет роли приписка та маленькая но в точных. Там запуск ракет или сложные расчеты физики Это вед может быть очень плохо.
Неужели надо писать свой тип данных в место double для точных вычислений или это можно как то поправить?
koln1 вне форума Ответить с цитированием
Старый 15.12.2012, 08:32   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Произвольное вещественное число (даже из конечного диапазона) нельзя записать с использованием конечной памяти. Поэтому расчёты в вещественных числах всегда будут иметь ненулевую погрешность.
2) Поэтому в реальных компьютерах используются типы "вещественных" чисел, которые в действительности являются рациональными числами вида A*2^n, где A и n - целые числа из ограниченного диапазона (см. также Вики).
3) Для расчётов указанного Вами рода используются другие типы данных - либо поддерживаемые теми процессорами, на которых эти расчёты выполняются (запуск ракет считается не процессором i5, всё-таки), либо аппаратно не поддерживаемые и эмулируемые программно.
4) Компилятор тут вообще ни при чём: какой тип данных на уровне процессора предусмотрен, такой он и предоставляет.
Abstraction вне форума Ответить с цитированием
Старый 15.12.2012, 08:49   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Если подробнее про то что сказал Abstraction:
Особенности представления чисел в компьютере
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 15.12.2012, 11:11   #4
koln1
Новичок
Джуниор
 
Регистрация: 15.12.2012
Сообщений: 2
По умолчанию

Всем спасибо.
koln1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TMaskEdit типа Double kashirin.p Общие вопросы Delphi 0 17.04.2012 17:23
Как вывести long double на экран при использование компилятора Intel w_cproc_p_11.1.065 под Visual Studio FPU128bit Visual C++ 9 13.05.2010 10:49
in Формула типа String out результат типа Double Gypsy Общие вопросы Delphi 3 16.04.2010 10:21
VISUAL STUDIO 2008 defaul language - как переключить в VISUAL STUDIO 2008 язык программирования, использ Эйнж Общие вопросы C/C++ 0 27.12.2009 20:39
преобразование десятичной дроби в обыкновенную и обратно, Delphi ИгорьОК Помощь студентам 4 04.04.2007 21:12