una tres por para niños multiplicar multiplicaciones multiplicacion jugando enseñar ejercicios como cifras cifra c++ c optimization

c++ - tres - Multiplicar por 0 optimización



multiplicaciones por tres cifras (2)

Depende de si el compilador implementa IEEE754. Ni C ni C ++ requieren que un compilador admita NaN , pero IEEE754 sí.

Supongamos que tengo:

double f(const double *r) { return 0*(r[0]*r[1]); }

¿Debería el compilador ser capaz de optimizar el segmento, o aún tiene que realizar la operación, en caso de que los valores puedan ser inf o nan?

gcc -O3 -S test.c: .file "test.c" .text .p2align 4,,15 .globl f .type f, @function f: .LFB0: .cfi_startproc movsd (%rdi), %xmm0 mulsd 8(%rdi), %xmm0 mulsd .LC0(%rip), %xmm0 ret .cfi_endproc .LFE0: .size f, .-f .section .rodata.cst8,"aM",@progbits,8 .align 8 .LC0: .long 0 .long 0 .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3" .section .note.GNU-stack,"",@progbits

Parece que no hay eliminación?

aha

gcc -O3 -ffast-math -S test.c .file "test.c" .text .p2align 4,,15 .globl f .type f, @function f: .LFB0: .cfi_startproc xorpd %xmm0, %xmm0 ret .cfi_endproc .LFE0: .size f, .-f .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3" .section .note.GNU-stack,"",@progbits


No solo es inf y NaN que impide la optimización allí, también es el signo - 0.0 * algo negativo es -0.0 , de lo contrario es 0.0 , así que realmente tienes que calcular el signo de r[0]*r[1] .