Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемма с double 
V
    Опции темы
FREEDEV
Дата 4.5.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 6.3.2007
Где: Украина->Одесс а

Репутация: 1
Всего: 3



Добрый день!
Возникла проблеммка с double. Операции умножения, деления приводят к появлению лишних знаков после запятой, например:
3*0.01 возвращает что, то вроде 0.030000001
5*0.02 = 0.0499999998
Немогу разобраться в чем дело, может кто встречался с подобным
--------------------
Microsoft Windows Visla ©
PM MAIL   Вверх
jonie
Дата 4.5.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



дело в машинном представлении чисел с плавающей запятой в компьютере.
погугли, там все очень неплохо написано....
вкратце : потому что компьютер сохраняет число как 2^М


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
source777
Дата 4.5.2008, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Интересно сколько миллионов раз этот вопрос задавался? smile 

P.S. FREEDEV, открой для себя округление...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Lycifer
Дата 5.5.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



округление хорошо ну вот если нужно посчитать точное значение?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 5.5.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Округлять по-разному можно, например до 8-го знака после запятой.


--------------------
user posted image
PM MAIL WWW   Вверх
source777
Дата 5.5.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(Lycifer @  5.5.2008,  17:11 Найти цитируемый пост)
округление хорошо ну вот если нужно посчитать точное значение? 
Точные значения в обыкновенных дробях считаются, а не в десятичных, это ещё в 5-ом классе средней школы проходят, тут даже механизмы хранения вещественных чисел в памяти компьютера непричём...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
amarenkov
Дата 6.5.2008, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(Lycifer @  5.5.2008,  17:11 Найти цитируемый пост)
посчитать точное значение


Можно еще при расчетах использовать преобразование в другую систему счисления. В моем проекте, например, в одном месте из-за таких же проблем используются вычисления над 64-разрядными целыми числами. Правда это не я делал, но автор уверяет, что избавился от многих проблем smile.
PM MAIL ICQ   Вверх
Lycifer
Дата 6.5.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



Нет округление не пойдёт, просто сдесь приведёт пример когда значение уменьшается(то и есть его нужно увеличить), бываю сдучаи года 123.00000017
послу огругления будем иметь 123.0000002, ну или 123.0000001, а когда прибавим 0.00000001 будет совсем другое значения вобщемто очень приблезительное, единственное что вижу, так это то что можно реализовать класс, но он будет совсем не производителен!!
PM MAIL ICQ   Вверх
Дрон
Дата 6.5.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Lycifer, используй тип decimal.

Это сообщение отредактировал(а) Дрон - 6.5.2008, 13:19


--------------------
Да. Именно так.
PM   Вверх
source777
Дата 6.5.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(Lycifer @  6.5.2008,  12:23 Найти цитируемый пост)
бываю сдучаи года 123.00000017
не бывает таких случаев, если ты их сам специально не создаёшь, так что не гони...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
mr.DUDA
Дата 6.5.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Дрон, только вот тормознутый он, этот decimal, жутко... smile

А так конечно если бывает что вылезет погрешность, нужно её округлять. Других вариантов нет, AFAIK.


--------------------
user posted image
PM MAIL WWW   Вверх
Дрон
Дата 6.5.2008, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(mr.DUDA @  6.5.2008,  17:45 Найти цитируемый пост)
Дрон, только вот тормознутый он, этот decimal, жутко...

Ну так про требования к быстродействию автор ничего не сказал smile 

Это сообщение отредактировал(а) Дрон - 6.5.2008, 19:28


--------------------
Да. Именно так.
PM   Вверх
source777
Дата 6.5.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(mr.DUDA @  6.5.2008,  17:45 Найти цитируемый пост)
Других вариантов нет, AFAIK. 
Как же нет, я уже ещё 1 вариант назвал - вычисление в обычных дробях, так практически все математические пакеты поступают и никаких проблем с погрешностями не знают... другой вопрос, что это на много порядков более сложная задача, чем простое округление...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
jonie
Дата 6.5.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



не все числа представляются в виде обыкновенных дробей.... и такая задача становится еще сложнее)


и мат пакеты страдают порой и очень сильно от погрешности... сам один раз попал на это в матГаде.. тогда как Maple посчитал лучше (ну а руками так вообще хорошо посчиталось))....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
source777
Дата 9.5.2008, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(jonie @  6.5.2008,  23:30 Найти цитируемый пост)
и мат пакеты страдают порой и очень сильно от погрешности... сам один раз попал на это в матГаде.. тогда как Maple посчитал лучше (ну а руками так вообще хорошо посчиталось))....
Ну я Maple имел в виду, остальными я практически не пользуюсь... А Maple как раз на аналитических расчётах специализируется smile 

Цитата(jonie @  6.5.2008,  23:30 Найти цитируемый пост)
не все числа представляются в виде обыкновенных дробей....
теоретически все. Другое дело что число может представлять собой бесконечный ряд обыкновенных дробей и даже не один, а также в состав дробей могут входить любые арифметические операции(+ - * / ^), ну да ленивые вычисления никто не отменял...

P.S. Ну и в конечном итоге, можно посмотреть чему примерно равен полученный в виде громадной дроби результат, и тут за дело вновь берётся округление...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
mr.DUDA
Дата 9.5.2008, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



source777, трабл в том что обычно нужен ввод исходных данных в виде строки. И тут ты хоть колом на голове теши, не сможешь перевести все возможные числа, введённые пользователем, из формата floating point в формат делимое/делитель. Ну вот введу я к примеру "1,01928" и напиши алгоритм вычисляющий сабж. smile


--------------------
user posted image
PM MAIL WWW   Вверх
source777
Дата 9.5.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(mr.DUDA @  9.5.2008,  20:32 Найти цитируемый пост)
Ну вот введу я к примеру "1,01928" и напиши алгоритм вычисляющий сабж.
Это как раз таки самая элементарнейшая часть данной задачи. 
Алгоритм:
1) выяснить сколько цифр после запятой ввёл пользователь, равно m
2) числитель = k = исх.число * 10^m
3) знаменатель = n = 10 ^ m
4) по алгоритму Евклида находим НОД(k; n)
5) сокращаем и получаем обыкновенную дробь, "введённую" пользователем.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
FREEDEV
Дата 12.5.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 6.3.2007
Где: Украина->Одесс а

Репутация: 1
Всего: 3



Давненько я сюда не заглядывал, спасибо всем за ответы.
Действительно числа представлены в компьютере степенями двойки, поэтому в Debugeре видна была подобная картина, результат же выводимый пользователю, имел нормальный вид. За исключением значений массива в сумме дававших 0,  тогда возвращаемым значением было что-то наподобие указанного выше, поправил округлением.

--------------------
Microsoft Windows Visla ©
PM MAIL   Вверх
Lycifer
Дата 14.5.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



source777
Это конечно хорошо использовать дробь, тока есть такой вопрос, как же быть если приходится передавать в функции и конечно получать результаты(sin, cos...)?
PM MAIL ICQ   Вверх
source777
Дата 14.5.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(Lycifer @  14.5.2008,  10:05 Найти цитируемый пост)
Это конечно хорошо использовать дробь, тока есть такой вопрос, как же быть если приходится передавать в функции и конечно получать результаты(sin, cos...)? 
А тут нам на помощь спешат многочисленные тригонометрические формулы, ряды Тейлора и конечно же ленивые вычисления, я уже об этом писал чуть выше...
P.S. Не забывай, что любая математическая функция может быть представлена в виде суммы ряда обыкновенных дробей, причём функцию, представленную в таком виде, можно вычислить с любой точностью, а точность задаётся когда запрашивается результат, тогда же и происходят реальные вычисления...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.3069 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.