Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Операции с действительными числами в Release - сборках
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Юджин Юджин вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2005
По умолчанию Операции с действительными числами в Release - сборках - 03.05.2006, 15:41

Код:
long cmqty, qty; 
float fqty; 

float GetOpnUsage() {...} 
///////////////// 

fqty = GetOpnUsage(op) * (float) qty; 
cmqty = (long) fqty; 

if ((float)cmqty < fqty) 
{ 
cmqty++; 
}
Проблема такая (только в Release сборке!!!): лучше на конкретных цифрах. qty = 40,
GetOpnUsage() возвращает 17.825. По идее, перемножив их, получиться должно 713 (условия if фыполниться не должно). Но if выполняется, cmqty инкрементится и принимает значение 714...

В чем тут дело, как с этим бороться?! Замучился уже, может кто знает?
Ответить с цитированием
  (#2 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 03.05.2006, 15:57

Операции с плавающей точкой далеко не всегда дают "ровный" в десятичной системе счисления результат. Скорее всего, в результате умножения у тебя получается что-то вроде 713.00000001, поэтому операция сравнения и возвращает истину.


P.S.: размещать одинаковые постинги в разных форумах запрещено Правилами форума:
http://www.hardforum.ru/rules.php
Надеюсь, ты делаешь это в последний раз.
Ответить с цитированием
  (#3 (permalink)) Старый
Sartorius Sartorius вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.04.2006
По умолчанию 03.05.2006, 16:02

Не совсем понятно зачем ты сначала преобразуешь в long ,
а затем обратно во float и сравниваешь с собой одно и то же значение.
А вообще для вещественных чисел необходимо использовать
сравнение с учетом потери точности
например
вместо (float1 == float2) нужно ((float1 - float2) < eps), а еще лучше
((float1 - float2) / float1 < eps1);
вместо (float1 < float2) нужно ((float2 - float1) > eps)
и тд и тп
Ответить с цитированием
  (#4 (permalink)) Старый
Sartorius Sartorius вне форума
Member
 
Сообщений: 92
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.04.2006
По умолчанию 03.05.2006, 16:04

Ну вот пока писал уже Garik ответил
Ответить с цитированием
  (#5 (permalink)) Старый
Юджин Юджин вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2005
По умолчанию 03.05.2006, 16:06

Цитата:
Originally posted by Garik
[b]Операции с плавающей точкой далеко не всегда дают "ровный" в десятичной системе счисления результат. Скорее всего, в результате умножения у тебя получается что-то вроде 713.00000001, поэтому операция сравнения и возвращает истину.
Да, это видимо так. Но:
1) Почему только в Release компиляции?
2) Как бы вы посоветовали это обойти? В смысле, есть ли какие-то функции, например, из math.h? Как я понимаю, обычное сравнение, ввод некой delta и проверка a - b < delta не помогут...
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Юджин Юджин вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2005
По умолчанию 03.05.2006, 16:16

Цитата:
Originally posted by Sartorius
[b]Не совсем понятно зачем ты сначала преобразуешь в long ,
а затем обратно во float и сравниваешь с собой одно и то же значение.
Это я так оригинально отбрасываю дробную часть
Ответить с цитированием
  (#7 (permalink)) Старый
Юджин Юджин вне форума
Member
 
Сообщений: 23
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 31.03.2005
По умолчанию 03.05.2006, 16:24

Всем спасибо огромное, тема закрыта!
Ответить с цитированием
  (#8 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 03.05.2006, 17:31

Цитата:
Originally posted by Юджин
[b]Это я так оригинально отбрасываю дробную часть :oops:
Для этого намного сподручнее использовать функции floor() и ceil().
Ответить с цитированием
  (#9 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 03.05.2006, 17:31

Цитата:
Originally posted by Юджин
[b]Всем спасибо огромное, тема закрыта! :D
Поделись, как в итоге решил свою проблему. Может кому-нибудь ещё пригодится.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операции с двоичными числами uniss Visual Basic 1 12.12.2010 19:23
Release компиляция в VC 2005 для Qt-приложения delafrog Visual C++ 6 24.10.2008 00:58
Как заставить Release-версию DLL работать вместе с Debug приложением Odin_KG Visual C++ 6 28.07.2007 09:41
Firefox: Release Candidate 2.0 выход второго браузера Shunix Новости 0 09.10.2006 18:38
Ошибка из-за конфигурации Release Fess exe Visual C++ 7 12.09.2006 07:26
Требуется Release Engineer, SCM Specialist, Install Engineer -HR- Marianne Работа 0 07.10.2005 19:11
Операции над двоичными числами Винитарх Prolog 5 05.07.2005 11:12
Debug работает , Release - не работает что с этим делать NiТR0 Visual C++ 2 04.07.2005 11:27
Почему не отображается меню в Release AKyJIA Visual C++ 11 08.02.2005 13:14
Release/Debug не работает пр компилировании MrLamozzz Visual C++ 4 04.11.2004 19:35
Debug и Release установка программ и работа yta Visual C++ 9 01.10.2004 20:38
Как скомпилировать release-версию Anonymous Visual C++ 3 10.09.2003 11:45



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов