Alguien puede explicar este comportamiento? Soy bien consciente de la máquina a nivel de la representación de números de punto flotante. Esto parece estar relacionado con printf y sus formatos.
Ambos números se representan con exactitud mediante la notación de punto flotante (de verificación: multiplicando por 64 da un número entero).

#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);
}

De salida:

> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000

Nota, el primer número se presenta redondeado hacia abajo, y el segundo uno se redondea hacia arriba.

Usted podría estar interesado en mi artículo exploringbinary.com/… . Algunas implementaciones de uso «alrededor de la mitad-lejos-de-cero» en lugar de «de vuelta a la mitad-a-par».
Parece que Microsoft ha cambiado su defecto redondeo comportamiento en algún momento entre VS 2010 y VS2015. Acabo de actualizar desde una a la otra y tiene algunos muy molesto y sutiles errores. blog es, probablemente, destinado a poner de relieve el cambio, pero usted sería perdonado por falta de él por completo.
depende de la aplicación las diferencias de Redondeo en Windows vs Unix sistema basado en sprintf, C++ comportamiento de Redondeo consistencia de los lazos con sprintf

OriginalEl autor user443854 | 2012-04-27

2 Comentarios

  1. 18

    Es «alrededor de la mitad que incluso» o «del redondeo». El último dígito de la parte redondeada de la representación es el elegido para ser, incluso si el número es exactamente a mitad de camino entre los dos.

    http://linuxgazette.net/144/misc/lg/a_question_of_rounding_in_issue_143.html:

    «Para la biblioteca de C de GNU, la regla de redondeo utilizado por los printf() es «banqueros redondeo» o «redondeo». Esto es más correcta que la de otros C bibliotecas, como la C99 especificación dice que la conversión a decimal debe utilizar el seleccionado actualmente IEEE modo de redondeo (por defecto banqueros de redondeo).»

    también: gnu.org/software/libc/manual/html_node/Rounding.html
    El autor de el artículo enlazado es incompetente. «Binario y decimal radix no comparten el mismo conjunto de números irracionales» – eso es una tontería. La racionalidad/irracionalidad es independiente de la base.
    De hecho. Pero el citado pasaje de el artículo es correcto, ya que el autor dolorosamente aprendido en su informe de errores.

    OriginalEl autor Daniel Fischer

  2. 0

    La %9.5f de salida da el número de 5 dígitos después del punto decimal que es el más cercano de la fuente número.

    OriginalEl autor Basile Starynkevitch

Dejar respuesta

Please enter your comment!
Please enter your name here