Ошибка добавления CGFloat? - PullRequest
4 голосов
/ 05 сентября 2011

Я пытался рекурсивно добавить некоторые значения CGFloat в мою программу. И я только что понял в одном конкретном сценарии, что общая сумма была неправильной. Чтобы убедиться, что в моей программной логике нет ничего плохого, я создал простой пример этого сценария (см. Ниже), и он напечатал то же неверное значение.

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

Первый NSLog печатает 689580736.000000 ... в то время как правильный результат 689580720. Однако второй NSLog печатает правильный результат. Я не уверен, что это ошибка или я делаю что-то не так.

Спасибо, Murali

1 Ответ

11 голосов
/ 05 сентября 2011

CGFloat - это число с плавающей запятой одинарной точности для 32-битных целей, таких как iOS, - оно имеет только 23-битную мантиссу, то есть около 6-7 значащих цифр.Используйте тип с двойной точностью, если вам нужна большая точность.

Вероятно, вам следует прочитать Дэвида Голдберга о том, что должен знать каждый компьютерщик об арифметике с плавающей запятой , прежде чем приступать к обучению программированию.1006 *

...