确定给定的浮点数arg是否正常,即既不是零,也不是正常,无限,也不是NaN.
数字为零,无限或NaN很清楚它意味着什么.但它也说低于正常.什么时候是一个数字次正常?
我想对"非正常数据"以及它的内容有一个广泛的看法,因为我认为我唯一正确的事情是从程序员的角度来看与浮点值特别相关的事实,它与一般事项有关 -从CPU角度看计算方法.
有人可以为我解密这2个字吗?
编辑
请记住,我是面向C++应用程序而且只面向C++语言.
通常我们说浮点数在小数点后的精度为6位数.但是如果我们存储大量的10 ^ 30的数量,我们将不会得到小数点后的6位数.那么浮点数在小数点后的精度为6位是否正确?
所以,这几乎是中期的时间,教授给了我们一些示例问题.
我认为答案是:
给出一个f = 50000的浮点数.
如果我们做f*f我们得到2,500,000,000.
现在,我假设我们正在使用32位机器,因为这是我们迄今为止研究的内容.因此,如果是这种情况,则默认情况下认为2,500,000,000 32位浮点未被声明为无符号.由于2,500,000,000比4294967296的32位表示稍微超过一半,并且它已经签名,我们将返回负值,因此语句f*f <0将为真,对吧?
我只学习了4周的系统编程,如果我错了,请纠正我.
我正在努力改善surf.cpp的表现.从第140行,您可以找到此功能:
inline float calcHaarPattern( const int* origin, const SurfHF* f, int n )
{
double d = 0;
for( int k = 0; k < n; k++ )
d += (origin[f[k].p0] + origin[f[k].p3] - origin[f[k].p1] - origin[f[k].p2])*f[k].w;
return (float)d;
}
Run Code Online (Sandbox Code Playgroud)
运行英特尔顾问矢量化分析,它显示"1数据类型转换存在",这可能是低效的(特别是在矢量化中).
但我的问题是:看看这个函数,为什么作者会创建das double然后将其转换为float?如果他们想要一个十进制数字,float那就没关系.我想到的唯一原因是,因为double它更精确float,然后它可以代表更小的数字,但最终值足够大,可以存储在a中float,但我没有对d值进行任何测试.
还有其他可能的原因?