После прочтения комментариев и ответов на другой вопрос С тех пор я задал вопрос, я понял, что проблема возникла из-за неточности с плавающей запятой, которая означала, что некоторые значения (например, 0,01) не пройдут логический тест наконец программы.Я изменил его, чтобы вместо него использовать NSDecimalNumber
переменные.
double num, originalnum, multiplier;
int a;
NSLog(@"Enter a number");
scanf("%lf", &num);
//keep a copy of the original number
originalnum = num;
//increases the number until it is an integer, and stores the amount of times it does it in a
for (a=1; fmod(num, 1) != 0 ; a++) {
num *= 10;
}
a--;
//when square-rooted the decimal points have to be added back in
multiplier = pow(10, (a/2));
if (fmod(originalnum, 1) != 0) {
multiplier = 10;
}
NSDecimalNumber *temp = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:sqrt(num)/multiplier] decimalValue]];
NSDecimalNumber *result = [temp decimalNumberByMultiplyingBy:temp];
NSDecimalNumber *originum = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:originalnum] decimalValue]];
if ((fmod(sqrt(num), 1) == 0) && ([result isEqualToNumber:originum])) {
NSLog(@"The square root of %g is %@", originalnum, temp);
}
else {
NSLog(@"The square root of this number is irrational");
}