Я сделал это:
#include <stdio.h>
#include <stdlib.h>
typedef long double ldbl;
ldbl x[1<<20];
void hexdump( void* p, int N ) {
for( int i=0; i<N; i++ ) printf( "%02X", ((unsigned char*)p)[i] );
}
int main( int argc, char** argv ) {
printf( "sizeof(long double)=%i\n", sizeof(ldbl) );
if( argc<2 ) return 1;
int i;
ldbl a = ldbl(1)/atoi(argv[1]);
for( i=0; i<sizeof(x)/sizeof(x[0]); i++ ) x[i]=a;
while(1) {
for( i=0; i<sizeof(x)/sizeof(x[0]); i++ ) if( x[i]!=a ) {
hexdump( &a, sizeof(a) );
printf( " " );
hexdump( &x[i], sizeof(x[i]) );
printf( "\n" );
}
}
}
, скомпилированный с IntelC с использованием / Qlong_double, так что он произвел это:
;;; for( i=0; i<sizeof(x)/sizeof(x[0]); i++ ) if( x[i]!=a ) {
xor ebx, ebx ;25.10
; LOE ebx f1
.B1.9: ; Preds .B1.19 .B1.8
mov esi, ebx ;25.47
shl esi, 4 ;25.47
fld TBYTE PTR [?x@@3PA_TA+esi] ;25.51
fucomp ;25.57
fnstsw ax ;25.57
sahf ;25.57
jp .B1.10 ; Prob 0% ;25.57
je .B1.19 ; Prob 79% ;25.57
[...]
.B1.19: ; Preds .B1.18 .B1.9
inc ebx ;25.41
cmp ebx, 1048576 ;25.17
jb .B1.9 ; Prob 82% ;25.17
и запустил 10 экземпляров с разными "семенами".Как вы можете видеть, он сравнивает 10-байтовые длинные дубликаты из памяти с одним в стеке FPU, поэтому в случае, когда ОС не сохраняет полную точность, мы наверняка увидим ошибку.И они по-прежнему работают, ничего не обнаруживая ... что неудивительно, поскольку в x86 есть команды для одновременного сохранения / восстановления всего состояния FPU, и в любом случае ОС, которая не сохранит полную точность, будет полностью сломана..
Таким образом, либо какая-то уникальная ОС / процессор / компилятор, либо отличающиеся результаты сравнения создаются после изменения чего-либо в программе и перекомпиляции, или из-за ошибки в программе, например.переполнение буфера.