【问题标题】:Do I need to specify x.yf if I define a float?如果我定义一个浮点数,我需要指定 x.yf 吗?
【发布时间】:2015-01-04 09:07:57
【问题描述】:

所以我的问题是

float a = 1.5 + 1.3;

完全没问题,或者如果需要的话:

float a = 1.5f + 1.3f;

有人告诉我,C 编译器将不带 f 的浮点数作为双精度数,这种情况可能会导致某处的计算不精确。

这样对还是原来的方式就足够了?

【问题讨论】:

  • 原始方式将(排序)工作,但是编译器将应用大量转换。从 double 到 float 'can' 的转换会丢失有效数字。就像将数字转换为双精度一样,执行加法,然后将数字转换回浮点数

标签: c types floating-point double


【解决方案1】:

float a = 1.5 + 1.3; 行等价于float a = (float) (1.5 + 1.3);,其中加法是double 常量之间的double 加法。(*)

a 中的最终结果几乎与加法是单精度常量之间的单精度加法相同。事实上,从单精度版本更可能不是最接近 28/10 的 float 的意义上说,它比以更高精度计算转换为浮点数更好。使用最佳可用精度进行计算并转换为 float 进行存储是 IEEE 754 标准化如此多精度的原因之一(映射到 C 中的 floatdouble 和有时 long double)。

(*) 为简单起见,此答案假定您的编译器实现了FLT_EVAL_METHOD=0。当编译器实现FLT_EVAL_METHOD>0 时,它会自动存储1.3 等常量,并以更好的可用精度计算中间结果,正是因为这是一件好事。

【讨论】:

  • 谢谢,这是一个完美的答案!
【解决方案2】:
float a = 1.5 + 1.3;

没问题,但是你通常会得到一个编译器警告,比如

truncation from 'double' to 'float'

对于小数字来说这不是问题。

float 最好使用 f 后缀,douuble 最好不要后缀。

【讨论】:

  • 在编译时间方程的情况下,不同意“最好使用 f 后缀作为浮点数”。这个答案的重点是消除截断警告,但会忽略像float a = 0.1f + 6.0f/7.0f v. 0.1 + 6.0/7.0 这样在我的平台上给出的答案略有不同的精度损失。 f 一开始不太准确。
  • @chux on by platform 我得到了相同的结果,但你肯定是对的。我要删除这个答案。
  • IMO 你关于编译器警告的回答很有用。
猜你喜欢
  • 2011-08-21
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2023-02-07
  • 2013-09-04
  • 2018-03-06
相关资源
最近更新 更多