|
|
1
4
固定点很好,因为在这种情况下,您使用的是16位。最简单的方法是根据需要的精度乘以10的幂。如果您可以使用32位整数作为中间值,那么您应该能够获得相当高的精度。最后,您可以转换回16位int,舍入或截断您喜欢的。 编辑: 您需要向左移动,使值变大。将移位结果存储在精度更高的类型中(32位或64位,具体取决于您需要的类型)。 如果使用带符号的类型,简单的移位将不起作用 当心你是乘还是除两个不动点的数字。乘以结果为(a*n)*(b n)最后你会得到一个 乙 n^2而不是a 乙 n.分部是(a) n)/(b) n)是(a/b)而不是(a) n)/b)。这就是为什么我建议使用10的幂,如果你不熟悉固定点,很容易发现你的错误。 当你完成计算后,你移回右边,回到16位int。 如果你想变漂亮,你也可以在换班前做四舍五入。 如果你真的对实现有效的固定点感兴趣,我建议你读一些书。 http://www.digitalsignallabs.com/fp.pdf |
|
|
2
3
答案 this SO question 在实施方面相当全面。这里有一个比我在那里看到的更多的解释: 一种方法是将所有数字强制到一个范围内,比如说[-1.0,1.0)。然后,将这些数字映射到范围内[-2^15,(2^15)-1]。例如,
当你把这两个数字相乘时
最后一行除以32768就是点 Patros 关于需要额外缩放步骤的倍数。如果您显式地编写2^n缩放比例,这就更有意义了:
这就是算术。对于实现,注意两个16位整数的乘法需要一个32位的结果,所以temp应该是32位的。另外,32768在16位变量中是不可表示的,因此请注意编译器将使32位立即生效。正如你已经注意到的,你可以切换到乘/除2的幂,这样你就可以写
但是假设[-1,1)范围不正确吗?如果你想限制你的数字,比如说,[-4.0,4.0),你可以使用n=13。然后有1个符号位,在二进制点之前有2个位,在二进制点之后有13个位。它们分别称为1.15和3.13定点分数类型。你用分数来交换净空。 增加和减少分数类型可以很好地工作,只要你注意饱和度。正如帕特罗斯所说,对于分水岭,缩放实际上取消了。所以你必须这么做
或者,为了保持精确性
用整数乘和除正常工作。例如,要除以6,你可以简单地写
如果除以2的幂,
不过,增加和减少整数并不是很简单。您必须首先查看整数是否适合您的x.y类型,生成等效的分数类型,然后继续。 我希望这有助于实现这一想法,查看另一个问题中的代码以实现清晰的实现。 |
|
|
3
1
请看一下这个描述快速乘法算法的页面。 |
|
4
1
一般来说,假设您将使用带符号的16.16定点表示。所以32位整数将有一个有符号的16位整数部分和一个16位小数部分。那么我不知道iPhone开发中使用了什么语言(可能是Objective-C?),但是这个例子在C中:
请注意,以上是一个简单的实现,不提供算术溢出保护。例如,在div16q16()中,为了保持精度,在除法之前进行多次运算,但根据操作数的不同,运算可能会溢出。您可以使用64位中介来克服这个问题。而且除法总是向下取整,因为它使用整数除法。这将提供最佳性能,但可能会影响迭代计算的精度。修复很简单,但会增加开销。 请注意,当乘以或除以2的恒定功率时,大多数编译器都会发现一些微不足道的优化,并使用移位。但是C并没有定义负整数右移的行为,所以为了安全和可移植性,我把它留给编译器来解决。无论你用什么语言。 在OO语言中,fixed16q16-u自然是带有运算符重载的类的候选者,因此您可以像使用普通算术类型一样使用它。 您可能会发现在类型之间转换很有用:
这是基础,有可能得到更复杂,并添加三角函数和其他数学函数。 固定的加法和减法与内置的+和-运算符及其变体一起工作。 |
|
|
mikko · SwiftUI如何在不同堆栈中实现同一视图的平滑动画 1 年前 |
|
|
routern · 如何组合contextMenu和圆角矩形? 1 年前 |
|
|
DevHome98 · 3D触摸不适用于设备swift 2 年前 |
|
|
dunoiww · 从全屏返回时如何触发onAppear 2 年前 |
|
|
Community wiki · iPhone上ivar的继承问题 2 年前 |
|
|
Community wiki · 查找iOS日历 2 年前 |
|
|
Community wiki · 有效的IPhone编程技术[关闭] 3 年前 |