簡體   English   中英

縮小轉換 (int64_t * static_cast<float> (雙倍的))</float>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM