我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库,并且要求使用运算符重载。因为原来用 C 写过,这次写,思路上没有太大问题,不过全部程序被我 C++ 化了,代码看过去很诡异……呃……
我自己的机子上,自然使用 g++ 编译,不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下,发现好几个错误和无数警告……其实也是我意料之中的。
Read the rest of this entry »
我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库,并且要求使用运算符重载。因为原来用 C 写过,这次写,思路上没有太大问题,不过全部程序被我 C++ 化了,代码看过去很诡异……呃……
我自己的机子上,自然使用 g++ 编译,不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下,发现好几个错误和无数警告……其实也是我意料之中的。
Read the rest of this entry »
Comments
之前的版本犯了一个重大的错误!我错了……没有经过认真的实验就贴出来……
正文开始前,先看一个式子:
1 | x != x |
大家觉得,这个东西的返回可能为 true 么?事实上是可能的,只要这个 x 是 NaN,并且这个 C 编译器符合 IEEE 754 的标准。
所谓 NaN,即 Not A Number,不是一个数。这是 IEEE 754 国际浮点数运算标准当中规定的一个特殊值,这个值由于不是一个数,所以有很多奇怪的特性,比如上面这个不等于其本身。
虽然有这么个东西,而且是国际标准,不过我们也知道,这世界上总有那么些公司是不喜欢理会国际标准的,邪恶的 M$ 就是其中之一。而 Visual C++ 6.0 的 C 编译器也就“有幸”成为了少有的不能完全兼容 IEEE 754 的编译器之一。
至此,我们发现一个问题:邪恶的 M$ 的东西中,总是最垃圾的流传的最广,IE6 如此,VC6 也是如此。另外,在此声明一下,这里讲的全部是 C,不是 C++,在 C++ 中另外有一些比较符合标准的方式同时被各个编译器兼容。
OK,回归正题,既然 VC6 的编译器是个渣,可我们有的时候还是不得不让自己的代码与之兼容,于是就有了各种解决办法。
Read the rest of this entry »
Comments