Qualcuno può spiegare questo comportamento? Sono ben consapevole della rappresentazione a livello macchina dei numeri in virgola mobile. Questo sembra essere correlato a printf e ai suoi formati. Entrambi i numeri sono rappresentati esattamente dalla notazione in virgola mobile (verificare: moltiplicando per 64 si ottiene un numero intero).comportamento di arrotondamento printf per i doppi
#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);
}
uscita:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
nota, il primo numero viene arrotondato verso il basso, e il secondo viene arrotondato.
Potresti essere interessato al mio articolo http://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/. Alcune implementazioni usano "round-half-from-zero" invece di "round-half-even". –
Sembra che Microsoft abbia cambiato il comportamento di arrotondamento predefinito tra VS 2010 e VS2015. Ho appena aggiornato da uno all'altro e ho ottenuto alcuni bug molto fastidiosi e sottili. [Questo blog] (https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1 /) è probabilmente pensato per evidenziare il cambiamento, ma ti verrebbe perdonato per averlo perso completamente. – omatai
dipende dall'implementazione [Arrotondamento differenze su sistema basato su Windows vs Unix in sprintf] (http://stackoverflow.com/q/4649554/995714), [C++ Corrispondenza comportamento arrotondamento per legami con sprintf] (http: // stackoverflow. com/q/31142600/995714) –