Почему деление (?) Дает это число? - PullRequest
1 голос
/ 24 ноября 2010

Перефразируя вопрос:

Следующий код (не на C ++ - написанный на собственном языке сценариев)

if(A*B != 0.0)
{
   D = (C/(A*B))*100.0;
}
else
{
   D = 0.0;
}

дает значение

90989373681853939930449659398190196007605312719045829137102976436641398782862768335320454041881784565022989668056715169480294533394160442876108458546952155914634268552157701346144299391656459840294022732906509880379702822420494744472135997630178480287638496793549447363202959411986592330337536848282003701760.000000

для D. Мы на 100% уверены, что A != 0.0.И мы почти на 100% уверены, что B == 0.0.Мы никогда не используем такие бесконечно малые значения (близкие к 0,0, но не 0,0), такие как значение B, которые предлагает это значение C.Невозможно, чтобы он приобрел это значение из наших данных.Может ли A*B дать что-либо, что не равно 0.0, когда B равно 0?

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Число, которое вы поделили, было , а не на самом деле 0, просто очень, очень близко.

1 голос
/ 25 ноября 2010

Предполагая, что вы используете числа с плавающей запятой IEEE, не рекомендуется использовать равные или не равные в этом случае с числами с плавающей запятой. Даже если одинаковые значения, такие как -0.0 и +0.0, они не равны с побитовой точки зрения, это то, что делает equate. Даже если используются другие форматы с плавающей запятой, одинаковые и не равные не рекомендуется.

Вместо этого поместите в него какой-нибудь диапазон e = a * b; если ((e <0,0002) || (e> 0,0002), то ...

0 голосов
/ 24 ноября 2010

Похоже, что вы получаете ошибку из предыдущих вычислений, поэтому вы делитесь на действительно маленькое десятичное число, но не на ноль.Вы должны добавить предел погрешности, если хотите перехватить что-то вроде этого, psuedocode: if(num < margin_of_error) ret inf;, или использовать метод epsilon, чтобы быть еще безопаснее

...