[英]Narrowing conversion on a (int64_t * static_cast<float>(double))
我正在修復我正在使用的代碼庫中的一些 lint 錯誤,我看到以下行
// note offset is int64_t, scale is int64_t, x is double
int64_t y = offset + lrintf(scale * static_cast<float>(x))
linter 抱怨說narrowing conversion from 'int64_t' (aka 'long') to 'float'
。
似乎scale * static_cast<float>(x)
是導致問題的原因,我想知道處理此錯誤的最佳方法是什么? 我應該將scale
轉換為 double,然后調用lrintd
嗎? 或者對於這種情況有更好的方法嗎?
你是對的。 static_cast
丟棄尾數和指數中的一些位。 這也限制了float(scale)
的尾數中的位數。
請注意,典型的 IEEE754 double
精度數在尾數中的位數也不足以完全表達每個int64_t
值。 這是合乎邏輯的:兩者都是 8 字節類型。 但是 float 在 IEEE754 中只有 4 個字節。
使用起來似乎更合乎邏輯
int64_t y = offset + llrint(scale * x);
scale * x
將是double
並且應該四舍五入到long long
(又名int64_t
)。
無論如何請注意,這可能會在某些情況下修改程序行為(將double
精度截斷為float
或不截斷可能導致不同的y
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.