如果f是双精度数,f+=1和f+=1.0有什么区别吗?
is there any difference between f+=1 and f+=1.0 if f is a double?
假设我们有double f;
f+=1
和f+=1.0
有什么区别吗?
编译器如何处理这些情况?
我尝试在我的电脑上循环1010次,经过的时间几乎是相同的
此处指c++03
4.9浮点整型转换[conf .fpint]
可以是整型或枚举类型的右值转换为浮点类型的右值。结果是精确的如果可能的话。否则,它是实现定义的选择下一个较低或较高的可表示值。
如果您的系统可以精确地表示1.0(并且看起来可以),那么表达式是相同的。
在任何自尊的编译器中都没有区别,隐式强制转换肯定会在编译时执行,甚至可能禁用优化。但是,如果您有疑问,您可以随时检查生成的程序集。
现在,从风格上讲,我更喜欢总是使用"正确"类型的常量(特别是在表达式中,有些术语可能会在稍后更改为int),尽管有些人认为所有末尾的.0
只会增加视觉混乱(但是:您可以避免末尾的0
,只留下点来指定双字量-就像1.
一样)。
在非优化的构建中可能会有轻微的区别:整数常数1可以(应该?)在运行时而不是编译时提升为double。
您可以随时检查您的系统:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
double f(0.);
cout << std::is_same<decltype(f+1), decltype(f+1.)>::value << endl;
return 0;
}
如果有人发现他们有不同的地方,我希望能评论一下
相关文章:
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?