"auto" 关键字是否总是将浮点值计算为双精度值?
Does "auto" keyword always evaluates floating point value as double?
继续已关闭的问题:
C++: "auto" keyword affects math calculations?
正如人们所建议的那样,我通过向浮点值添加“f”后缀来修改代码。
#include <cmath>
unsigned int nump=12u;
auto inner=2.5f;
auto outer=6.0f;
auto single=2.f*3.14159265359f/nump;
auto avg=0.5f*inner+0.5f*outer;
for (auto i=0u;i<nump;++i){
auto theta=i*single;
auto px=avg*sin(theta);
auto py=avg*cos(theta);
auto tw=17.f;
int v1=std::round(1.f+px-tw/2.0f);
int v2=std::round(2.f+py-tw/2.0f);
std::cout<<"#"<<i<<":"<<v1<<";"<<v2<<std::endl;
}
对比
#include <cmath>
unsigned int nump=12u;
float inner=2.5f;
float outer=6.0f;
float single=2.f*3.14159265359f/nump;
float avg=0.5f*inner+0.5f*outer;
for (unsigned int i=0u;i<nump;++i){
float theta=i*single;
float px=avg*sin(theta);
float py=avg*cos(theta);
float tw=17.f;
int v1=std::round(1.f+px-tw/2.0f);
int v2=std::round(2.f+py-tw/2.0f);
std::cout<<"#"<<i<<":"<<v1<<";"<<v2<<std::endl;
}
结果完全相同 - 两个版本的输出不同。
那么这是否意味着“auto”总是将浮点值计算为“double”类型?
问题是您的代码使用的是 ::sin
而不是 std::sin
(cos
也是如此)。也就是说,您正在使用全局命名空间中的 sin
函数。
std::sin
为 float
超载。但是 ::sin
不是,它总是 returns 一个 double
(因为 ::sin
是遗留的 C 函数,而 C 没有函数重载)。
在您的代码中使用 std::sin
和 std::cos
来解决问题。
当您使用文字 2.5f
时,您已经在暗示该值是一个浮点数。
您会发现,如果您在为自动变量赋值时尝试使用 2.5
作为文字,它会将其推导出为双精度。
auto var1 = 2.5 // deduced as type double
auto var2 = 2.5f // deduced as type float as suggested in literal
继续已关闭的问题: C++: "auto" keyword affects math calculations?
正如人们所建议的那样,我通过向浮点值添加“f”后缀来修改代码。
#include <cmath>
unsigned int nump=12u;
auto inner=2.5f;
auto outer=6.0f;
auto single=2.f*3.14159265359f/nump;
auto avg=0.5f*inner+0.5f*outer;
for (auto i=0u;i<nump;++i){
auto theta=i*single;
auto px=avg*sin(theta);
auto py=avg*cos(theta);
auto tw=17.f;
int v1=std::round(1.f+px-tw/2.0f);
int v2=std::round(2.f+py-tw/2.0f);
std::cout<<"#"<<i<<":"<<v1<<";"<<v2<<std::endl;
}
对比
#include <cmath>
unsigned int nump=12u;
float inner=2.5f;
float outer=6.0f;
float single=2.f*3.14159265359f/nump;
float avg=0.5f*inner+0.5f*outer;
for (unsigned int i=0u;i<nump;++i){
float theta=i*single;
float px=avg*sin(theta);
float py=avg*cos(theta);
float tw=17.f;
int v1=std::round(1.f+px-tw/2.0f);
int v2=std::round(2.f+py-tw/2.0f);
std::cout<<"#"<<i<<":"<<v1<<";"<<v2<<std::endl;
}
结果完全相同 - 两个版本的输出不同。 那么这是否意味着“auto”总是将浮点值计算为“double”类型?
问题是您的代码使用的是 ::sin
而不是 std::sin
(cos
也是如此)。也就是说,您正在使用全局命名空间中的 sin
函数。
std::sin
为 float
超载。但是 ::sin
不是,它总是 returns 一个 double
(因为 ::sin
是遗留的 C 函数,而 C 没有函数重载)。
在您的代码中使用 std::sin
和 std::cos
来解决问题。
当您使用文字 2.5f
时,您已经在暗示该值是一个浮点数。
您会发现,如果您在为自动变量赋值时尝试使用 2.5
作为文字,它会将其推导出为双精度。
auto var1 = 2.5 // deduced as type double
auto var2 = 2.5f // deduced as type float as suggested in literal