1.注意数据类型,避免数据运算后出现溢出
int 型 32位
long long 型
float 型
double 型
问题1:
long double B_din = (double) B * 4294967296.0f; 如果B=0.855824,
结果等于 3675737856.000000 而不是3675736091.131904
原因:
这种差异可能是由于浮点数到长双精度浮点数转换中的精度损失,特别是在使用不同的浮点数表示(例如单精度 float
与双精度 double
)和计算顺序时。在你的表达式中,你首先将 B
(假设为 double
类型)转换为 float
(通过 0.855824f
或 0.855824
后的 .0f
指示)进行乘法运算,这可能会引入误差。
为了得到更准确的结果,你应该直接使用 double
类型的常量,并避免不必要的类型转换,特别是到精度较低的 float
类型。让我们直接计算 B * 4294967296.0
使用 double
类型,并检查结果。
B = 0.855824
并直接乘以 4294967296.0
(双精度表示的 232232),计算结果确实是 3675736091.131904
因此,之前的不匹配可能是由于在你的C代码中,无意中将 B
与一个 float
类型的常量相乘导致的精度损失。确保所有计算都使用足够高的精度(在这里是 double
类型)来最小化这类误差。
问题2:
2.half数据类型运算
报错:identifier "__hmul" is undefined
解决方式:https://cloud.tencent.com/developer/ask/sof/114261054/answer/129158863