Обёртка над плавающей точкой
От: Feonyf  
Дата: 16.11.10 20:28
Оценка:
Привет всем. Столкнулся с "приятными" моментами связанные с плавающей точкой.
Например:

double d1 = 0.3;
double d2 = 0.1+0.2;
ASSERT(d1 != d2);


и т.п.

Почитал форум, понял и вооружился функцией bool IsEqual(double x,double y);

Т.е. нужно сравнивать double при помощи этой функции. Однако хочется использовать оператор "==".

Вопрос: как использовать этот оператор если его использовать нельзя ?

Варианты ответов, которые пришли мне в голову:
1. перегрузить глобальный оператор (не пробовал и есть сомнение что это можно)
2. написать класс-обертку над double. Назвать его Double.
3. использовать библиотеку. (какую предложите?)

четвертый и далее ответы предлагается найти уважаемому All.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: Обёртка над плавающей точкой
От: Uzumaki Naruto Ниоткуда  
Дата: 16.11.10 20:41
Оценка:
пишем свой класс, переопределяем оператор ==

Re: Обёртка над плавающей точкой
От: Vain Россия google.ru
Дата: 16.11.10 22:22
Оценка: +2
Здравствуйте, Feonyf, Вы писали:

F>Почитал форум, понял и вооружился функцией bool IsEqual(double x,double y);

Только тут должно быть 3 параметра типа double.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Обёртка над плавающей точкой
От: Feonyf  
Дата: 17.11.10 07:05
Оценка:
Здравствуйте, Vain, Вы писали:

V>Только тут должно быть 3 параметра типа double.


Здесь
http://rsdn.ru/forum/cpp/458196.1.aspx
Автор: Андрей Галюзин
Дата: 27.11.03


решение с двумя параметрами. Оно меня пока устраивает.

Кстати. Подскажите пожалуйста библиотеку которая для вычислений не превращает дробные числа в плавающую точку а хранит их виде пары целых чисел.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[3]: Обёртка над плавающей точкой
От: Sharpeye Россия  
Дата: 17.11.10 07:45
Оценка: 2 (1)
Здравствуйте, Feonyf, Вы писали:

F>Здравствуйте, Vain, Вы писали:


V>>Только тут должно быть 3 параметра типа double.


F>Здесь

F>http://rsdn.ru/forum/cpp/458196.1.aspx
Автор: Андрей Галюзин
Дата: 27.11.03


F>решение с двумя параметрами. Оно меня пока устраивает.


F>Кстати. Подскажите пожалуйста библиотеку которая для вычислений не превращает дробные числа в плавающую точку а хранит их виде пары целых чисел.


Boost.Rational
Re[3]: Обёртка над плавающей точкой
От: blackhearted Украина  
Дата: 17.11.10 09:53
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>Здравствуйте, Vain, Вы писали:


V>>Только тут должно быть 3 параметра типа double.


F>Здесь

F>http://rsdn.ru/forum/cpp/458196.1.aspx
Автор: Андрей Галюзин
Дата: 27.11.03


F>решение с двумя параметрами. Оно меня пока устраивает.


F>Кстати. Подскажите пожалуйста библиотеку которая для вычислений не превращает дробные числа в плавающую точку а хранит их виде пары целых чисел.


Вроде как epsilon корректно использовать только, когда справниваемые чился порядка 1.0... тут даже тема есть, с объяснениями, можете поискать...
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
Re[3]: Обёртка над плавающей точкой
От: Vain Россия google.ru
Дата: 17.11.10 13:30
Оценка: +1
Здравствуйте, Feonyf, Вы писали:

V>>Только тут должно быть 3 параметра типа double.

F>Здесь
F>http://rsdn.ru/forum/cpp/458196.1.aspx
Автор: Андрей Галюзин
Дата: 27.11.03

F>решение с двумя параметрами. Оно меня пока устраивает.
Это зависит от алгоритма, но универсальная функция сравнения должна иметь 3 параметра.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: warning компилятора
От: Feonyf  
Дата: 17.11.10 17:45
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>
F>double d1 = 0.3;
F>double d2 = 0.1+0.2;
F>ASSERT(d1 != d2);
F>


Почему при вызове опертора == для double компилятор не выдаёт даже варнинга? Это, ведь, очевидно что лажа получается.
(Проверял на VC2010)
Разве бывают практические случаи когда вызывать этот оператор есть смысл ?
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: Библиотека думающая как человек
От: Feonyf  
Дата: 17.11.10 18:07
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>Привет всем. Столкнулся с "приятными" моментами связанные с плавающей точкой.


Еще вопрос насчет библиотеки, которая отличается от boost::rational.

Вступление:
Есть некоторая последовательность вычислений в которой некое число умножается на корень из двух а потом некоторое время спустя делится на корень из двух.
Понятно что человек сделает точные вычисления — выкинет умножение и деление на этот корень т.к. это единица.

Вопрос:
есть ли в природе такая библиотека которая так делает ?

Т.е. есть некий, назовём условно boost::rational2, который работает примерно следующим образом (написано от первого лица):
0. у меня есть x
1. меня умножают на пи. Это число в обычной дроби не представить поэтому я запомню что меня умножали на него
2. ко мне прибавляют 25 но я состою из пи умноженного на x, поэтому я запомню что мне нужно прибавить к этому делу 25
3. ко мне прибавляют 16. О! Ко мне уже прибавляли 25 я сейчас к этому прибавлю еще 16. Т.е. сейчас у меня есть x умноженный на пи и прибавленное 41. (41 это 16+25)
4. от меня просят double! Хорошо, сейчас я умножу x на 3.14 и прибавлю 41 и отдам им этот double.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[2]: warning компилятора
От: Vain Россия google.ru
Дата: 17.11.10 18:25
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>>
F>>double d1 = 0.3;
F>>double d2 = 0.1+0.2;
F>>ASSERT(d1 != d2);
F>>

F>Почему при вызове опертора == для double компилятор не выдаёт даже варнинга? Это, ведь, очевидно что лажа получается.
F>(Проверял на VC2010)
А почему компилятор должен значь что ты хочешь сделать? Может ты действительно на чистое равенство хотел проверить?
F>Разве бывают практические случаи когда вызывать этот оператор есть смысл ?
На равенство то? Да нули на равенство хотя-бы проверить.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Обёртка над плавающей точкой
От: MasterZiv СССР  
Дата: 18.11.10 07:26
Оценка: -1
On 16.11.2010 23:28, Feonyf wrote:
> Т.е. нужно сравнивать double при помощи этой функции. Однако хочется
> использовать оператор "==".
>
> Вопрос: как использовать этот оператор если его использовать нельзя ?

Его не "нельзя использовать". Его НЕ НУЖНО испльзовать. В нём НЕТ НАДОБНОСТИ.
Так же, как и в сравнении двух double-ов на равенство.
Поймите вы все (задающие подобные вопросы) эту простую вещь.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Обёртка над плавающей точкой
От: A.Lokotkov Россия  
Дата: 18.11.10 07:52
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>http://rsdn.ru/forum/cpp/458196.1.aspx
Автор: Андрей Галюзин
Дата: 27.11.03

F>решение с двумя параметрами. Оно меня пока устраивает.

Интересно, почему там точность нормируется относительно суммы сравниваемых значений, а не максимума из них?
bloß it hudla
Re[4]: Обёртка над плавающей точкой
От: Feonyf  
Дата: 18.11.10 16:22
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Здравствуйте, Feonyf, Вы писали:


F>>http://rsdn.ru/forum/cpp/458196.1.aspx
Автор: Андрей Галюзин
Дата: 27.11.03

F>>решение с двумя параметрами. Оно меня пока устраивает.

AL>Интересно, почему там точность нормируется относительно суммы сравниваемых значений, а не максимума из них?


Наверно ошибка.

Здесь получше написано:
http://www.rsdn.ru/forum/cpp/2640596.aspx
Автор: McSeem2
Дата: 31.08.07
— отсюда я брал.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[2]: Обёртка над плавающей точкой
От: Feonyf  
Дата: 18.11.10 16:27
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Поймите вы все (задающие подобные вопросы) эту простую вещь.


Вот и я думаю. Зачем его тогда вообще ввели ?

здесь: http://rsdn.ru/forum/cpp/4042737.1.aspx
Автор: Feonyf
Дата: 17.11.10
пытаюсь это выяснить.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[4]: Обёртка над плавающей точкой
От: Erop Россия  
Дата: 18.11.10 17:29
Оценка:
Здравствуйте, A.Lokotkov, Вы писали:

AL>Интересно, почему там точность нормируется относительно суммы сравниваемых значений, а не максимума из них?


Возможно, это быстрее...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Обёртка над плавающей точкой
От: MasterZiv СССР  
Дата: 18.11.10 17:56
Оценка:
On 18.11.2010 19:27, Feonyf wrote:

> Вот и я думаю. Зачем его тогда вообще ввели ?


Кого ?
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.