以下是一个程序:
#include<math.h>
#include<cstring>
#include<iostream>
#include<typeinfo>
int main()
{
int t;
std::cin>>t;
if( std::strcmp( typeid((-1+sqrt(1+8*t))/2).name(), "i" ) == 0 )
std::cout<<"YES";
else
std::cout<<"NO";
return 0;
}
这里typeid((-1+sqrt(1+8*t))/2).name(),
在编译时评估(由老师讲述),因此总是返回f(浮动)或d(小数)。
我想知道一种方法或任何能在运行时告诉我表达式类型的函数。
答案 0 :(得分:3)
typeid
仅告诉您在编译时确定的静态类型。由于sqrt
,您正在编写的表达式始终是浮点数。另一方面,typeid(int((-1+sqrt(1+8*t))/2)).name()
当然是"i"
。
但我认为你实际想要的是知道操作是否具有取决于输入的整数结果。您可以做的最好的事情是检查计算值(始终是浮点值!)是否足够接近整数值,例如:
double val = (-1+sqrt(1+8*t))/2;
if (fabs(round(val) - val) < 1e-5) std::cout << "YES"; // and so on
请注意,由于浮点不精确,您永远不能指望该值完全积分。因此,我检查(在此示例中)舍入值和原始值之间的差异小于1e-5
。
此外,我建议#include <cmath>
使用math.h
,并使用std
命名空间(std::round
等功能),等等。