Diferença na aritmética de ponto flutuante entre x86 e x64

Eu me deparei com uma diferença na maneira como a aritmética de ponto flutuante é feita entre as compilações do MS VS 2010 para x86 e x64 (ambas executadas na mesma máquina de 64 bits).

Este é um exemplo de código reduzido:

float a = 50.0f;
float b = 65.0f;
float c =  1.3f;
float d = a*c;
bool bLarger1 = d<b;
bool bLarger2 = (a*c)<b;

O bLarger1 booleano é sempre falso (d é definido como 65.0 em ambas as compilações). A variável bLarger2 é falsa para x64, mas verdadeira para x86!

Conheço bem a aritmética de ponto flutuante e os efeitos de arredondamento que estão ocorrendo. Também sei que 32 bits às vezes usa instruções diferentes para operações flutuantes que compilações de 64 bits. Mas, neste caso, estou perdendo algumas informações.

Por que existe uma discrepância entre bLarger1 e bLarger2 em primeiro lugar? Por que ele está presente apenas na compilação de 32 bits?

questionAnswers(2)

yourAnswerToTheQuestion