柏林噪声发生器在斯威夫特

我有这个代码在obj-c中产生一维噪声,它工作得很好:

- (float)makeNoise1D:(int)x { x = (x >> 13) ^ x; x = (x * (x * x * (int)_seed + 19990303) + 1376312589) & RAND_MAX; return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & RAND_MAX) / 1073741824.0); } 

现在我试图在Swift中重现它,但是它总是失败,并返回EXEC_BAD_INSTRUCTION。 这就是现在的样子,我不得不吐出最后的表情,但是我非常确定这不是问题。

 func makeNoise1D(var x : Int) -> Float{ x = (x >> 13) ^ x; x = (x * (x * x * seed! + 19990303) + 1376312589) & 0x7fffffff var inner = (x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff return ( 1.0 - ( Float(inner) ) / 1073741824.0) } 

我已经尝试了许多不同的演员,并分解成子expression式,但仍然失败。 我唯一的想法是,第一行和最后一行是有效的。 (我的大多数testing用例x被设置为20,种子为10,只是为了简单)

谢谢您的帮助!

如果一个计算的结果不能表示为一个Int ,就会发生“算术溢出”。

与(Objective-)C不同的是,在Swift中添加和相乘整数不会“回绕”或“截断”,但如果结果不符合数据types,则会导致错误。

但是你可以使用Swift的“溢出运算符” &*&+ ,它总是截断结果:

 func makeNoise1D(x : Int) -> Float{ var x = x x = (x >> 13) ^ x; x = (x &* (x &* x &* seed! &+ 19990303) &+ 1376312589) & 0x7fffffff let inner = (x &* (x &* x &* 15731 &+ 789221) &+ 1376312589) & 0x7fffffff return ( 1.0 - ( Float(inner) ) / 1073741824.0) } 
Interesting Posts