以下代码引发了assert
Red Hat 5.4 32 位,但适用于 Red Hat 5.4 64 位(或 CentOS)。
在 32 位上,我必须将 的返回值millis2seconds
放在一个变量中,否则assert
会引发 ,表明double
从函数返回的值与传递给它的值不同。
如果您评论“#define BUG”行,它会起作用。
感谢@R,将 -msse2 -mfpmath 选项传递给编译器使 millis2seconds 函数的两种变体都可以工作。
/*
* TestDouble.cpp
*/
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
static double millis2seconds(int millis) {
#define BUG
#ifdef BUG
// following is not working on 32 bits architectures for any values of millis
// on 64 bits architecture, it works
return (double)(millis) / 1000.0;
#else
// on 32 bits architectures, we must do the operation in 2 steps ?!? ...
// 1- compute a result in a local variable, and 2- return the local variable
// why? somebody can explains?
double result = (double)(millis) / 1000.0;
return result;
#endif
}
static void testMillis2seconds() {
int millis = 10;
double seconds = millis2seconds(millis);
printf("millis : %d\n", millis);
printf("seconds : %f\n", seconds);
printf("millis2seconds(millis) : %f\n", millis2seconds(millis));
printf("seconds < millis2seconds(millis) : %d\n", seconds < millis2seconds(millis));
printf("seconds > millis2seconds(millis) : %d\n", seconds > millis2seconds(millis));
printf("seconds == millis2seconds(millis) : %d\n", seconds == millis2seconds(millis));
assert(seconds == millis2seconds(millis));
}
extern int main(int argc, char **argv) {
testMillis2seconds();
}