Frage

Ich habe versucht, einige CGFloat -Werte in meinem Programm rekursiv hinzuzufügen. Und ich habe gerade festgestellt, dass in einem bestimmten Szenario die Gesamtsumme falsch war. Um sicherzustellen, dass ich in meiner Programmlogik nichts Falsches hatte, habe ich ein einfaches Beispiel für dieses Szenario erstellt (siehe unten) und dies druckte den gleichen falschen Wert.

CGFloat arr[3] = {34484000,512085280,143011440};
CGFloat sum = 0.0;
sum = arr[0] + arr[1] + arr[2];

NSLog(@"%f",sum);

int arr1[3] = {34484000,512085280,143011440};
int sum1 = 0.0;
sum1 =  arr1[0] + arr1[1] + arr1[2];

NSLog(@"%d",sum1);

Das erste NSLOG druckt 689580736.000000 ... während das richtige Ergebnis 689580720. Das zweite NSLog druckt jedoch das richtige Ergebnis. Ich bin mir nicht sicher, ob dies ein Fehler ist oder ob ich etwas falsch mache.

Danke, Murali

War es hilfreich?

Lösung

CGFloat ist ein einzelner Präzisionsschwimmer auf 32 Bitzielen wie iOS - es hat nur ein 23 -Bit -Mantissa, dh ca. 6 bis 7 signifikante Ziffern. Verwenden Sie einen doppelten Präzisionstyp, wenn Sie eine größere Genauigkeit benötigen.

Sie sollten wahrscheinlich David Goldbergs lesen Was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte Bevor Sie viel weiter mit dem Programm lernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top