में अलग-अलग परिणाम निम्न प्रोग्राम (here से अनुकूलित) जीसीसी (4.8.2) और क्लैंग (3.5.1) के साथ संकलित होने पर असंगत परिणाम दे रहा है। विशेष रूप से, FLT_EVAL_METHOD
करता है, भले ही जीसीसी परिणाम परिवर्तित नहीं होता है।वही FLT_EVAL_METHOD, जीसीसी/क्लैंग
#include <stdio.h>
#include <float.h>
int r1;
double ten = 10.0;
int main(int c, char **v) {
printf("FLT_EVAL_METHOD = %d\n", FLT_EVAL_METHOD);
r1 = 0.1 == (1.0/ten);
printf("0.1 = %a, 1.0/ten = %a\n", 0.1, 1.0/ten);
printf("r1=%d\n", r1);
}
टेस्ट:
$ gcc -std=c99 t.c && ./a.out
FLT_EVAL_METHOD = 0
0.1 = 0x1.999999999999ap-4, 1.0/ten = 0x1.999999999999ap-4
r1=1
$ gcc -std=c99 -mpfmath=387 t.c && ./a.out
FLT_EVAL_METHOD = 2
0.1 = 0x0.0000000000001p-1022, 1.0/ten = 0x0p+0
r1=1
$ clang -std=c99 t.c && ./a.out
FLT_EVAL_METHOD = 0
0.1 = 0x1.999999999999ap-4, 1.0/ten = 0x1.999999999999ap-4
r1=1
$ clang -std=c99 -mfpmath=387 -mno-sse t.c && ./a.out
FLT_EVAL_METHOD = 2
0.1 = 0x0.07fff00000001p-1022, 1.0/ten = 0x0p+0
r1=0
ध्यान दें कि, this blog post के अनुसार, जीसीसी 4.4.3 दूसरे टेस्ट में के बजाय उत्पादन 0 1 हुआ करता था।
ए possibly related question इंगित करता है कि जीसीसी 4.6 में एक बग को सही किया गया है, जो बता सकता है कि जीसीसी का परिणाम अलग क्यों है।
मैं यह पुष्टि करना चाहता हूं कि इनमें से कोई भी परिणाम गलत होगा या यदि कुछ सूक्ष्म मूल्यांकन कदम (जैसे एक नया प्रीप्रोसेसर ऑप्टिमाइज़ेशन) इन कंपाइलरों के बीच अंतर को औचित्य देगा।
मुझे हाल ही में पुराने जीसीसी संस्करणों के व्यवहार की जांच करनी है और किसी ने मुझे https://gcc.godbolt.org पर इंगित किया जो बहुत उपयोगी था। इसमें जीसीसी 4.4.3 नहीं है, लेकिन इसमें 4.4.7 है। –