digitalmars.D.bugs - [Issue 16341] New: 32-bit floating-point issue
- via Digitalmars-d-bugs (105/105) Jul 31 2016 https://issues.dlang.org/show_bug.cgi?id=16341
https://issues.dlang.org/show_bug.cgi?id=16341 Issue ID: 16341 Summary: 32-bit floating-point issue Product: D Version: D2 Hardware: x86 OS: Linux Status: NEW Severity: major Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: greensunny12 gmail.com While the difference is usually not noticeable, it's there and once used with pow and exp, it can yield to totally different results (that's how I discovered it). import std.stdio; alias S = float; float shL = 0x1.1b95eep-4; // -0.069235 float shR = 0x1.9c7cfep-7; // -0.012588 F fun(F)(F x) { return 1.0 + x * 2; } S working() { S r = fun(shR); S l = fun(shL); return (r - l); } S failing() { return (fun(shR) - fun(shL)); } unittest { writefln("work: %a", working); writefln("fail: %a", failing); assert(working == failing); } assembler: .text._D3foo7workingFZf segment assume CS:.text._D3foo7workingFZf _D3foo7workingFZf: push EBP mov EBP,ESP sub ESP,0Ch mov -0Ch[EBP],EBX mov EAX,GS:[00h] mov ECX,_D3foo3shRf TLS_IE push [ECX][EAX] call _D3foo10__T3funTfZ3funFNaNbNiNffZf PC32 fstp float ptr -8[EBP] mov EDX,GS:[00h] mov EBX,_D3foo3shLf TLS_IE push [EBX][EDX] call _D3foo10__T3funTfZ3funFNaNbNiNffZf PC32 fstp float ptr -4[EBP] fld float ptr -8[EBP] fsub float ptr -4[EBP] mov EBX,-0Ch[EBP] leave ret nop nop nop nop nop .text._D3foo7workingFZf ends .text._D3foo7failingFZf segment assume CS:.text._D3foo7failingFZf _D3foo7failingFZf: push EBP mov EBP,ESP sub ESP,010h mov -010h[EBP],EBX mov EAX,GS:[00h] mov ECX,_D3foo3shRf TLS_IE push [ECX][EAX] call _D3foo10__T3funTfZ3funFNaNbNiNffZf PC32 mov EDX,GS:[00h] mov EBX,_D3foo3shLf TLS_IE push [EBX][EDX] fstp float ptr -0Ch[EBP] call _D3foo10__T3funTfZ3funFNaNbNiNffZf PC32 fld float ptr -0Ch[EBP] fsubrp ST(1),ST mov EBX,-010h[EBP] leave ret nop .text._D3foo7failingFZf ends .text._D3foo10__T3funTfZ3funFNaNbNiNffZf segment assume CS:.text._D3foo10__T3funTfZ3funFNaNbNiNffZf _D3foo10__T3funTfZ3funFNaNbNiNffZf: fld float ptr 4[ESP] fadd ST(0),ST fld1 faddp ST(1),ST ret 4 nop nop nop .text._D3foo10__T3funTfZ3funFNaNbNiNffZf ends --
Jul 31 2016