Q1: Будет ли разделив число на его делитель теряют точность?
Если a
является большим он может потерять точность, в противном случае (если a
достаточно мал, чтобы быть точно представлено в виде поплавка), он не будет. Потеря точности может произойти уже при конвертации a
. Также подразделение потеряет точность, но иногда может быть, что эти потери точности будут взаимно компенсировать друг друга.
Например, если N = 8388609
и M=5
. У вас есть (двоичная) мантисса 100 ... 001 и умножается на 101 и заканчивается 101000 ... 0000101, но тогда последние два бита будут округлены до нуля, и вы получите ошибку в (float) (N * M), но затем, когда вы разделите их на пять, вы получите 1000 ... 00 и остаток от 100, что означает, что он должен округлить один шаг, и вы вернете исходный номер.
Q2: Пропустит ли значение поплавка, потеряв точность?
Нет, это не потеряет точность. Однако ваш код все равно не сможет определить его как точный.
Дело это может случиться, если K
является NaN
(например 0.0/0.0
), то x
также станет NaN
- однако NaN
не должна (должны) сравнить равных. В этом случае можно утверждать, что вы потеряли точность, и я согласен, но дело не в x=K
, которое теряет точность - вы уже потеряли точность при производстве K
.
'float (a)/N' только теряет точность, потому что' float (a) 'теряет точность. Когда 'a' точно представляется как float, а' N' является одним из его делителей, 'float (a)/N' должен быть точным. – user2357112