Следующий код поднимает 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();
}