You used literals of type double , not long double (you forgot the suffix). This means that when you wrote 2.7182818284589998 (impossible value for double ), the compiler had to choose between 2.718281828458999793696193592040799558162689208984375 and 2.71828182845899934960698374197818338871002197265625 ,
and when you wrote -0.21074699576017999 (another impossible value for double ), the compiler had to choose between -0.2107469957601799948054832611887832172214984893798828125 and -0.210746995760179967049907645559869706630706787109375 .
When rounding to the nearest value, the values ​​stored in dvalue and dexp were 2.718281828458999793696193592040799558162689208984375 and -0.2107469957601799948054832611887832172214984893798828125 (keeping the double in its long value does not change)
The result of the pow should be close to 0.8099789690729650165287354526069381795064774873497553965297999359066924950079080502973738475702702999114990234375 , which should then be 0.8099789690729650165287354526069381795064774873497553965297999359066924950079080502973738475702702999114990234375 in your case should be long double (except as I recall
placing the result in a 64-bit double , we must choose between 0.80997896907296496049610823320108465850353240966796875 and 0.80997896907296507151841069571673870086669921875 .
The correct answer (rounding to the nearest) is 0.80997896907296507151841069571673870086669921875 , and this is exactly what you got in the “32-bit result”, truncated as 0.80997896907296507 .
Your "64-bit result" looks like exactly another 64-bit double value, incorrectly rounded off from the correct result (and truncated as 0.80997896907296496 ). I would think that the QoI error: gcc, clang, intel and oracle give the only, correct result (even if they should not: IEEE accuracy requirements for pow allow more than 0.5 ulp errors)
By the way, if your pow returned an 80-bit long double Intel, it should have corresponded between 0.8099789690729650164951504420773886749884695746004581451416015625 and 0.809978969072965016549360550701663896688842214643955230712890625 , the last one.