¿Alguien puede explicar este comportamiento? Soy muy consciente de la representación a nivel de máquina de los números de coma flotante. Esto parece estar relacionado con printf y sus formatos. Ambos números están representados exactamente por notación de punto flotante (verificar: multiplicar por 64 da un número entero).printf comportamiento de redondeo para dobles
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
double x1=108.765625;
printf("%34.30f\n", x1);
printf("%9.5f\n", x1);
printf("%34.30f\n", x1*64);
double x2=108.046875;
printf("%34.30lf\n", x2);
printf("%9.5f\n", x2);
printf("%34.30f\n", x2*64);
}
Salida:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
Nota, el primer número se redondea hacia abajo, y el segundo se redondea hacia arriba.
Puede que le interese mi artículo http://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/. Algunas implementaciones usan "round-half-away-from-zero" en lugar de "round-half-to-even". –
Parece que Microsoft cambió su comportamiento de redondeo predeterminado en algún momento entre VS 2010 y VS2015. Acabo de actualizar de una a la otra y tengo algunos errores muy molestos y sutiles. [Este blog] (https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1 /) probablemente esté destinado a resaltar el cambio, pero sería perdonado por perderlo por completo. – omatai
depende de la implementación [Diferencias de redondeo en el sistema basado en Windows vs Unix en sprintf] (http://stackoverflow.com/q/4649554/995714), [Consistencia del comportamiento del redondeo C++ para las relaciones con sprintf] (http: // stackoverflow. com/q/31142600/995714) –