Google Calcolatrice Glitch, potrebbe galleggiare vsraddoppiare essere una possibile causa?

StackOverflow https://stackoverflow.com/questions/27095

  •  09-06-2019
  •  | 
  •  

Domanda

Ho fatto questo Solo per i calci (quindi, non esattamente una domanda, posso vedere il downmodding già avvenendo), ma, in sostituzione di Google ritrovata incapacità fare la matematica correttamente (controllare!secondo google 500,000,000,000,002 - 500,000,000,000,001 = 0), ho pensato di provare le seguenti operazioni in C per eseguire un po ' di teoria.

int main()
{
   char* a = "399999999999999";
   char* b = "399999999999998";

   float da = atof(a);
   float db = atof(b);

   printf("%s - %s = %f\n", a, b, da-db);

   a = "500000000000002";
   b = "500000000000001";
   da = atof(a);
   db = atof(b);
   printf("%s - %s = %f\n", a, b, da-db);
}

Quando si esegue questo programma, è possibile ottenere i seguenti

   399999999999999 - 399999999999998 = 0.000000
   500000000000002 - 500000000000001 = 0.000000

Sembrerebbe che Google utilizza 32 bit floating precisione (errore), se si interruttore a galleggiante per il doppio nel codice di cui sopra, è possibile risolvere il problema!Potrebbe essere?

/mp

È stato utile?

Soluzione

in C#, provare (doppio.maxvalue == (doppio.maxvalue - 100)) , si otterrà vero ...

ma questo è quello che dovrebbe essere:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

a pensarci, si dispone di 64 bit che rappresenta un numero maggiore di 2^64 (doppio.maxvalue), quindi l'imprecisione è previsto.

Altri suggerimenti

Per di più questo tipo di stupidità vedere questo bell'articolo di pertinenza calcolatrice di Windows.

Quando si modifica l'interno, nessuno se ne accorge

Le interiora di Calc - aritmetica motore - è stato buttato via e riscritta da zero.Il standard IEEE floating point libreria è stato sostituito con un arbitrario-aritmetica a precisione biblioteca.Questo è stato fatto dopo che la gente continuato a scrivere ha-ha articoli su come Calc potevo fare l'aritmetica decimale correttamente, che per esempio di calcolo 10.21 - 10.2 portato 0.0100000000000016.

Sembrerebbe che Google utilizza 32 bit floating precisione (errore), se si interruttore a galleggiante per il doppio nel codice di cui sopra, è possibile risolvere il problema!Potrebbe essere?

No, è solo rinviare il problema.raddoppia ancora presentano lo stesso problema, solo con grandi numeri.

@ebel

a pensarci, si dispone di 64 bit che rappresenta un numero maggiore di 2^64 (doppio.maxvalue), quindi l'imprecisione è previsto.

2^64 non è il massimo valore di un doppio.2^64 è il numero di valori unici di un doppio (o di qualsiasi altro 64-bit tipo) può contenere. Double.MaxValue è uguale a 1.79769313486232e308.

L'imprecisione con numeri in virgola mobile non rappresentano valori superiori a Double.MaxValue (il che è impossibile, ad esclusione di Double.PositiveInfinity).Esso deriva dal fatto che l'intervallo di valori è semplicemente troppo grande per il tipo di dati.E così fino precisione in cambio di un più ampio raggio d'azione.In essenza, ci sono in calo cifre significative, in cambio di un grande esponente della gamma.

@DrPizza

Non ancora;IEEE codifiche di utilizzare più codifiche per gli stessi valori.In particolare, NaN è rappresentato da un esponente di tutti i bit a 1, e quindi qualsiasi valore diverso da zero per la mantissa.Come tale, ci sono 252 NaNs per il doppio, 223 NaNs per i single.

Vero.Non ho account duplicati codifiche.Ci sono in realtà 252-1 NaNs per doppie e 223-1 NaNs per single, però.:p

2^64 non è il massimo valore di un doppio.2^64 è il numero di valori unici di un doppio (o di qualsiasi altro 64-bit tipo) può contenere.Doppio.MaxValue è uguale a 1.79769313486232e308.

Non ancora;IEEE codifiche di utilizzare più codifiche per gli stessi valori.In particolare, NaN è rappresentato da un esponente di tutti i bit a 1 e quindi qualsiasi valore diverso da zero per la mantissa.Come tale, ci sono 252 NaNs per doppie, 223 NaNs per i single.

Vero.Non ho account duplicati codifiche.Ci sono in realtà 252-1 NaNs per i doppi e 223-1 NaNs per single, però.:p

Doh, si è dimenticato di sottrarre infinities.

La stima approssimativa per la versione di questo problema che ho imparato è che a 32 bit carri dare 5 cifre di precisione e 64-bit carri dare 15 cifre di precisione.Questo, naturalmente, varia a seconda di come i carri sono codificati, ma è un buon punto di partenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top