一、使用 short int 和 float 两种类型的变量计算和验证两个问题。
1. x ^ 2 >= 0 ?
// 使用 C++ 编码如下(只显示 main 函数内的部分,头文件包括<iostream>, <limits.h>, <float.h>, <stdio.h>):
// 对于 short int 类型,其范围应为 [-32768,+32767]
for (short int i = -32768; i < 32768; i++)
{
if(i ^ 2 - 0 < 0)
cout << "Warning! " << i << "^2 < 0" << endl;
}
// 对于 float 类型,一般由 1符号位+8指数位+23尾数位组成,其范围为[-2^128,+2^128]
for (float f = FLT_MIN; f <= FLT_MAX; f + 0.1)
{
if(f ^ 2 - 0 < 0)
cout << " Warning! " << f << "^2 < 0" << endl;
}
2. (X + Y) + Z == X + (Y + Z) ?
short int i1, i2, i3, int1, int2;
while (cin >> i1 >> i2 >> i3)
{
int1 = (i1 + i2) + i3;
int2 = i1 + (i2 + i3);
if (int1 != int2)
cout << "Warning! " << "( " << i1 << " + " << i2 << " ) + " << i3 << " != " << i1 << " + ( " << i2 << " + " << i3 << " )" << endl;
}
float f1, f2, f3, flt1, flt2;
while (cin >> f1 >> f2 >> f3)
{
flt1 = (f1 + f2) + f3;
flt1 = f1 + (f2 + f3);
if (flt1 != flt2)
cout << "Warning! " << "( " << f1 << " + " << f2 << " ) + " << f3 << " != " << f1 << " + ( " << f2 << " + " << f3 << " )" << endl;
}
二、内存参照错误验证
1. fun 函数 和 主函数
double fun(int i)
{
volatile double d[1] = {3.14};
volatile long int a[2];
a[i] = 1073741824;
return d[0];
}
int main()
{
for(int i = 0; i < 5; i++)
{
cout << fun(i) << endl;
}
return 0;
}
2. 记录 fun(1)/ fun(2)/ fun(3)/ fun(4) 时的输出结果:
结果如图:
三、总结
我们发现由于变量类型存在约束范围,会因为变量的溢出而导致结果与自然认知不符;
同时,由于 ji 算机在进行较大数值 ji 算时会忽略较小数值,造成结果的些许偏差,甚至在二次 ji 算时出现明显的错误。
这使我们明白,编写程序不能想当然,也应该 kao 虑现实因素:硬件因素,编译因素等。 并且编程过程中的测 shi 也是必不可少的一环。