![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 15.12.2012
Сообщений: 2
|
![]()
Решил на писать небольшую математическую библиотеку и обнаружил баг с получением остатка от десятичной дроби.
Как известно чтобы получить: числител_дробный_части(остаток от дроби)=десятичная_дробь - целая_часть_числа И тут выяснилось что компилятор приписывает или вычитает очень, очень маленькое число такое что при округлении это незаметно но воспользовавшись методом Console.WriteLine("Дробная часть числа: {0}",g.Дробная_часть); //для дробной часть видно что приписка существует. исходники могу выложить. http://yadi.sk/d/WwKqp3b91Ecy4 Может быть в простых вычислениях это не играет роли приписка та маленькая но в точных. Там запуск ракет или сложные расчеты физики Это вед может быть очень плохо. Неужели надо писать свой тип данных в место double для точных вычислений или это можно как то поправить? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
![]()
1) Произвольное вещественное число (даже из конечного диапазона) нельзя записать с использованием конечной памяти. Поэтому расчёты в вещественных числах всегда будут иметь ненулевую погрешность.
2) Поэтому в реальных компьютерах используются типы "вещественных" чисел, которые в действительности являются рациональными числами вида A*2^n, где A и n - целые числа из ограниченного диапазона (см. также Вики). 3) Для расчётов указанного Вами рода используются другие типы данных - либо поддерживаемые теми процессорами, на которых эти расчёты выполняются (запуск ракет считается не процессором i5, всё-таки), либо аппаратно не поддерживаемые и эмулируемые программно. 4) Компилятор тут вообще ни при чём: какой тип данных на уровне процессора предусмотрен, такой он и предоставляет. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
![]()
Если подробнее про то что сказал Abstraction:
Особенности представления чисел в компьютере
Изобретатель велосипедов
|
![]() |
![]() |
![]() |
#4 |
Новичок
Джуниор
Регистрация: 15.12.2012
Сообщений: 2
|
![]()
Всем спасибо.
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |