assert
,但在 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();
}
360.0
。然后稍后您想要检查该值是否与默认值不同。在这种情况下,您应该编写x != 360.0
。 - David Heffernan