为什么浮点数值如3.14在默认情况下被认为是MSVC的两倍?
为什么我需要把3.14f而不是3.14来禁用所有这些警告? 这有一个连贯的理由吗?
这就是C ++(和C)标准所决定的。 浮点文字是doubletypes的,如果你需要浮动文字,你可以用f
来加后缀。 似乎没有任何明确的原因,为什么,但我想这是a)与C兼容,和b)精度和存储之间的折衷。
2.13.3浮点文字浮点文字的types是双精度的,除非用后缀明确指定。 后缀f和f指定float,后缀l和L指定long double。 如果缩放的值不在其types的可表示值的范围内,则该程序是格式不正确的。
C和C ++更喜欢双重浮动在几个方面。 正如你注意到的,分数文字是双重的,除非明确的浮动。 此外,浮动不能通过可变parameter passing,它们总是被提升为双倍(与可变参数中的char和short相同)。
最好把float
看作是一个合约的double
,而不是double
的float
。 也就是说, double
是首选的浮点types,并且在某些特定情况下需要使用较小版本的double
时使用float
。 这是我所知道的一个连贯的原因,然而这个规则是有道理的,即使你碰巧遇到了需要更小版本的情况。
这不是MSVC特有的,它是语言标准所要求的。
我build议不要降低精度,除非明确要求,所以默认是双倍的。
单精度浮点数所提供的精度的6个有效位数对于一般用途来说是很less的,当然,在现代台式处理器上,它将被用作手写代码优化,其中作者已经确定它是充分和必要的; 所以它是有道理的,一个明确的可见标记是必需的,以指定一个单一的精度文字。
这可能是C世界的一个标准。 双重是首选,因为它更精确,你可能不会看到任何性能差异。 阅读这篇文章 。
因为double
比float
漂亮大约3.14,也许? 这里是确切的值:
3.140000000000000124344978758017532527446746826171875( double
)
3.1400001049041748046875( float
)