抓狂!!对浮点数使用 abs() 函数求绝对值的代价!!

本文讨论了在Objective-C编程中如何正确计算浮点数的绝对值,并分享了作者通过解决该问题而优化游戏安装效果的经历。文章还提供了解决问题的代码示例,帮助开发者避免类似错误。

因程序需要,需求出浮点数的绝对值~

第一个想到的函数就是 abs(),不料无论怎么求,abs出来的结果都是0!!

是的,就是0!!

真是他妈的太奇怪了,我检查了一遍又一遍,代码的写法没有发现任何的问题,

可以求出来的结果他妈的就是0!!!

白白浪费了哥1个半小时以上,不泻泻火还真是他妈的受不了!!

这次我是真的学乖了,今后不管遇到了什么问题,10分钟每搞出来马上去google查!!

不过也得到了一些意外的收获,那就是我写的那块儿原来没我想地那么复杂,

基本上,求浮点数绝对值地问题解决了以后,将游戏安装到机器上得到地效果已经是相当地棒了。。

一句话,问题解决了就好。。。其实这次犯在这个问题上面还是怪自己太执拗,想当然~

总结一些,以下是从其他网站上面得到地一些新知识:

Question:

How do I convert a negative number to an absolute value in Objective-C?

i.e.

-10

becomes

10?

Answer:

Depending on the type of your variable, one of

 abs(int),

 labs(long),

 llabs(long long),

imaxabs(intmax_t),

 fabsf(float),

 fabs(double), or

 fabsl(long double).

(Alas, there is no habs(short) function. Or scabs(signed char) for that matter...)


下面粘上我更正之后地代码,可以试着将代码中的 fabsf 替换成 abs,可以得到截然不同的结果

-(void) setShapes:(NSMutableArray*)shapes {
	_shapes = shapes;
	int startX = 360;
	int deltaX = 40;
	int i = 0;
	int distance2center = 0;
	BOOL flag = YES;
	for(BYShape *shape in _shapes) {
		CCSprite *sprite = [shape getSprite];
		int w = sprite.contentSize.width;	// 形状的宽度~
		int h = sprite.contentSize.height;	// 形状的高度~
		float rotateRadians = CC_DEGREES_TO_RADIANS(-sprite.rotation);
		
		float absCosTheta = fabsf(cos(rotateRadians));
		float absSinTheta = fabsf(sin(rotateRadians));
		
		// w,h只能取得sprite未经任何处理时的高度和宽度,旋转之后,新的宽度和高度需要经过重新计算获得~
		// 矩形旋转后的实际宽度和高度可由以下公式获得:
		// width = w * abs(cos(theta)) + h * abs(sin(theta))
		// height = h * abs(cos(theta)) + w * abs(sin(theta))
//		float actualWidth = w * absCosTheta + h * absSinTheta;
		float actualHeight = h * absCosTheta + w * absSinTheta;
		
		float transformRatio = (float)TOOL_BAR_HEIGHT / actualHeight;	// 比率~
		
		if(transformRatio > 1.0f) {	// 如果形状本身的高度就小于 TOOL_BAR_HEIGHT 的话,不进行任何放缩以避免画质降低~
			transformRatio = 1.0f;
		}
		
		// 保留1位小数
//		NSString *reserveOneFloatPart = [NSString stringWithFormat:@"%0.1f", transformRatio];
//		transformRatio = [reserveOneFloatPart floatValue];
//		NSLog(@"保留1位小数: %.2f", transformRatio);
		
		sprite.position = ccp(startX + deltaX * i, 460);
		[sprite runAction:[CCScaleTo actionWithDuration:0.0f scale:transformRatio]];
				
		int spriteHalfWidth = sprite.contentSize.width * transformRatio / 2;
		if(i == 0) {	// 必须的(之前形状向中间移动的时候对不齐原因就在于没加上这句代码)!!!
			// 竟然会出现 transformRatio 和 sprite.scale 不相等的情况,奇葩(可能源于数据还未同步过来)~
			_previousShapeHalfWidth = spriteHalfWidth;	// 第一个形状的一半宽度
		}
		
		if(flag == YES) {
			flag = NO;
		} else {
			distance2center += spriteHalfWidth;
			distance2center += TOOL_BAR_INTERVAL;	// 两个形状之间的间隔距离~
		}
		float distance = 160.0f + distance2center;
		[sprite runAction:[CCMoveTo actionWithDuration:0.6f position:ccp(distance, 460.0f)]];
		distance2center += spriteHalfWidth;
		i += 1;
		[self addChild:sprite];
	}
}


<think>根据用户的问题,用户需要的是如何用编程语言对浮点数绝对值的方法或代码示例。结合提供的引用内容,可以提以下信息:1.引用[1]提到:输入一个浮点数,输出它的绝对值。并且指出,当浮点数为负数需要将其变为相反数,其他情况不需要操作。这给出了法思路。2.引用[2]展示了C++代码示例:使用if-else判断,如果输入的数大于等于0则直接输出,小于0则输出其相反数。同使用了`printf`保留两位小数。3.引用[3]展示了另一个C++代码示例:同样使用if-else判断,但这里处理了输入范围(-10000到10000),并且使用`setprecision`来设置输出精度。4.引用[4]提供了另一种更简便的方法:使用数学库中的绝对值函数。对于浮点数,可以使用`fabs`函数(需要包含头文件`math.h`或`cmath`)。因此,回答应该包括:-手动实现(使用条件判断)和调用库函数两种方法。-给出不同编程语言的示例(主要是C/C++,因为引用中都是C++代码)。-注意输出格式,如保留小数位数。另外,用户并没有指定具体语言,但引用的例子都是C++,所以以C++为主,但可以提及其他语言中类似的方法。结构:1.先解释浮点数绝对值的概念:非负。2.方法一:使用条件判断(单分支或双分支)手动实现。3.方法二:使用数学库函数(如C++的`fabs`)。4.给出代码示例,并解释关键点(如输出格式)。5.注意事项(如包含头文件等)。相关问题部分,根据用户问题,可以生成关于绝对值操作的其他问题,比如不同语言中的实现,或者相关数学函数的应用等。注意:用户要用中文回答。</think> ### 浮点数绝对值的编程实现 根据引用的技术资料,对浮点数绝对值主要有以下两种方法(以C++为例): #### 方法1:手动条件判断(基础实现) ```cpp #include <iostream> #include <iomanip> using namespace std; int main() { double num; cin >> num; if(num < 0) { cout << fixed << setprecision(2) << -num; } else { cout << fixed << setprecision(2) << num; } return 0; } ``` **实现原理**:通过`if`判断数是否为负,负数相反数(`-num`)[^1][^3]。 **注意**:`setprecision(2)`控制输出保留2位小数,需包含`<iomanip>`头文件[^3]。 #### 方法2:使用数学库函数(推荐) ```cpp #include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { double num; cin >> num; cout << fixed << setprecision(2) << fabs(num); return 0; } ``` **优势**:直接调用`fabs()`函数(需包含`<cmath>`头文件),代码更简洁且执行效率高[^4]。 **扩展**: - `int`类型:`abs(x)` - `long`类型:`labs(x)` - `float/double`类型:`fabs(x)`[^4] #### 关键法思想 通过条件分支判断浮点数符号: `if(n < 0) → 返回 -n` `else → 返回 n` 这是单分支决策结构的典型应用[^1]。 --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值