如何在目标 C 中以双操作数获取 COS90 的值



我正在尝试运行我的程序,我正在使用

double result = cos(90*M_PI/180);
NSLog("Cos 90 value %g",result);  //Prints 6.12323e-17

但是当我运行这个时

 NSLog("Cos 90 value %f",cos(90*M_PI/180)); //Prints 0

我想在结果(双精度)中获取 cos90 的值,它应该是 0.我知道这是浮点空气问题。但是如何解决它。有什么办法吗?

谢谢

由于cos的参数以弧度为单位,因此要计算 90º 的余弦,您需要传递 π/2 弧度。 π/2 约为 1.570796326794896619。最接近 π/2 的 IEEE 754 双精度约为 1.570796326794896558。显然,这些是不同的。后者的余弦约为 6.123•10-17。因此,您的余弦例程工作正常;它返回它所传递的数字的余弦。

π/2 传递到 cos 是不可能的,因为 π/2 不能表示为双精度。

根据您的要求,可能会有解决方法。例如,此表达式将返回(近似)x的余弦(以度为单位),当x为90:sin(M_PI/180*(90-x))时将正好为零。

问题是结果太小了。唯一的区别是格式说明符。 %g%f是不同的; %f通常在小数点后有六点精度,而%g则使用科学记数法表示小数字。您可以使用 %.100f 扩展小数点后打印的字符数,其中100是小数点后的字符数。不过,这不是很精确,并且在这么多小数位之后无法保证精度

编辑:好吧,现在我注意到你实际上试图计算什么。它不为零,因为该级别的浮点运算由于舍入等原因不精确。

最后我找到了解决方案。所有的解释都是正确的,但这个问题的"临时"解决方案是NSNumberFormatter.

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setAlwaysShowsDecimalSeparator:NO];
[formatter setAllowsFloats:YES];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setMinimumFractionDigits:0];
[formatter setMaximumFractionDigits:10]; //THIS IS IMPORTANT AS AFTER DECIMAL, DIGITS SHOULD BE LESS THAN 17 because there is difference of 6.12323e-17 
double result = cos(90*M_PI/180);
NSNumber *numberResult = [NSNumber numberWithDouble:result];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSLog(@"%@",[formatter stringFromNumber:number]); //Prints 0

这是一个临时解决方案。您也可以使用 %f 打印 cos 90 的值,但它也会打印小数点后不需要的六个 0。

相关内容

最新更新