Вопрос

Я пытался добавить некоторые значения 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 печатает правильный результат. Я не уверен, что это ошибка или я делаю что -то не так.

Спасибо, Мурали

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top