Если я хочу проверить, что положительное число с плавающей запятой A меньше обратного квадрата другого положительного числа с плавающей запятой B (в C99), может ли что-то пойти не так, если B очень маленькое?
Я мог бы представить, как это проверить
if(A<1/(B*B))
Но если B достаточно мало, может ли это привести к бесконечности? Если бы это произошло, код по-прежнему работал бы правильно во всех ситуациях?
В том же духе я мог бы сделать
if(1/A>B*B)
... что может быть немного лучше, потому что B * B может быть равно нулю, если B мало (это правда?)
Наконец, решение, которое я не могу себе представить неправильным,
if(sqrt(1/A)>B)
что, я думаю, никогда не приведет к делению на ноль, но все же может быть проблематичным, если A близко к нулю.
Итак, в основном, мои вопросы:
- Может ли 1/X быть бесконечностью, если X больше нуля (но мало)?
- Может ли X*X быть равным нулю, если X больше нуля?
- Будут ли сравнения с бесконечностью работать так, как я ожидаю?
РЕДАКТИРОВАТЬ: для тех из вас, кому интересно, я закончил тем, что сделал
if(B*A*B<1)
Я сделал это в таком порядке, так как визуально однозначно, какое умножение происходит первым.
0.0000000000000000000000003
, но трудно ответить на вопрос, не зная, какой точности будут ваши входные числа с плавающей запятой. - person Corey   schedule 02.06.2010if ( A*B*B < 1 )
? - person Nikolai Fetissov   schedule 02.06.20100.0000000000000000000000003
даже близко не находится на приблизительном уровне, где это могло бы стать проблемой (по крайней мере, для двойной точности). На самом деле, вы даже не можете ввести число, которое вызывает проблему, в поле комментария stackoverflow (если вы не разрешаете экспоненциальное обозначение). - person Stephen Canon   schedule 02.06.2010