Objective c 如何在目标c中获取双操作数cos90的值

Objective c 如何在目标c中获取双操作数cos90的值,objective-c,ios,floating-point,Objective C,Ios,Floating Point,我正在尝试运行我的程序,我正在使用 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 我想在结果(double)中得到cos90的值,它应该是0。我知道这是浮点运算的问题。但是如何解决它。有什么办法吗 谢谢问题是结果太小了。唯一的区别是格式

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

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
我想在结果(double)中得到cos90的值,它应该是0。我知道这是浮点运算的问题。但是如何解决它。有什么办法吗


谢谢

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


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

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

不可能将π/2传递给cos,因为π/2不能表示为double


根据您的要求,可能会有变通办法。例如,此表达式将返回(近似)x的余弦(以度为单位),当x为90时正好为零:
sin(M_PI/180*(90-x))
最后我找到了解决方案。所有解释都是正确的,但此问题的“临时”解决方案是使用
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

你想要解决的问题是什么?
M_PI_2
(另一种表达
90*M_PI/180
)略小于“实际”
PI/2
,因此余弦略大于零-乘以6E-17。使用
float
掩盖了这个问题,因为它的精度较低。是的,我想知道如何将cos90的值设为0?有什么办法吗?@dasblinkenlight如果我使用M_PI_2而不是M_PI,我会得到与cos30和其他三角值相同的值吗?@SahilWasan如果你使用
cos(M_PI_2/3)
您将获得与cos(30*M_PI/180)相同的值,是的。目标C是否提供函数sinpi()和cospi()?当使用cospi()而不是cos()时,Sahil将获得所需的结果,因为cospi(0.5)是0。