Walter Bright: > is not done because of roundoff error. Also, > 0 * x => 0 > is also not done because it is not a correct replacement if x is a NaN.
I have done a little experiment, compiling this D1 code with LDC: import tango.stdc.stdio: printf; void main(char[][] args) { double x = cast(double)args.length; double y = 0 * x; printf("%f\n", y); } I think the asm generated by ldc shows what you say: ldc -O3 -release -inline -output-s test _Dmain: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp movsd .LCPI1_0, %xmm0 movd 8(%ebp), %xmm1 orps %xmm0, %xmm1 subsd %xmm0, %xmm1 pxor %xmm0, %xmm0 mulsd %xmm1, %xmm0 movsd %xmm0, 4(%esp) movl $.str, (%esp) call printf xorl %eax, %eax movl %ebp, %esp popl %ebp ret $8 So I have added an extra "unsafe floating point" optimization: ldc -O3 -release -inline -enable-unsafe-fp-math -output-s test _Dmain: subl $12, %esp movl $0, 8(%esp) movl $0, 4(%esp) movl $.str, (%esp) call printf xorl %eax, %eax addl $12, %esp ret $8 GCC has similar switches. Bye, bearophile