我想知道在任何情況下,由于浮點不準確,這樣的代碼會不正確:
#include <math.h>
// other code ...
float f = /* random but not NAN or INF */;
int i = (int)floorf(f);
// OR
int i = (int)ceilf(f);
這些值是否有任何保證?如果我有一個格式良好的f(不是 NAN 或 INF)將i始終是它四舍五入的整數,無論??哪種方式。
我可以想象一種情況,其中(使用錯誤的規范/實作)您獲得的值是略低于真實值的值,而不是略高于/等于但實際上更接近的值。然后,當您截斷它時,它實際上會向下舍入到下一個較低的值。
鑒于整數可以是 ieee754 浮點中的精確值,我似乎不可能,但我不知道是否float保證是該標準
uj5u.com熱心網友回復:
C 標準在指定浮點行為方面很草率,因此在技術上并未完全指定floorf(f)產生 的正確下限f或ceilf(f)產生 的正確上限f。
盡管如此,我知道沒有任何 C 實作會出錯。
如果,而不是,則有 C 實作可能會以多種方式評估運算式,這些方式不會得到與始終使用 IEEE-754 算術相同的結果。floorf(some variable)floorf(some expression)
如果 C 實作定義了__STDC_IEC_559__,它應該使用 IEEE-754 算術評估運算式。
盡管如此,int i = (int)floorf(f);當然不能保證如果下限超出 的范圍,則設定i為下限。ffint
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473155.html
下一篇:將數字的數字存盤在陣列中
