CGfloat Addive Bug?
-
22-10-2019 - |
Вопрос
Я пытался добавить некоторые значения 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 значительных цифр. Используйте двойную точность, если вам нужна большая точность.
Вы, вероятно, должны прочитать Дэвид Голдберг Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой Прежде чем продолжить гораздо дальше с обучением для программы.