End*_*nke 5 random perlin-noise ios swift
我有这个代码用于在obj-c中生成1D噪声,它运行得非常好:
- (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);
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试在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)
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过很多不同的演员表并分成子表达式,但仍然失败了.我唯一能想到的是第一行和最后一行.(我的大多数测试用例x设置为20并且种子为10,只是为了简化)
谢谢您的帮助!
Mar*_*n R 10
如果计算结果无法表示为"算术溢出",则会导致异常Int.
与(Objective-)C不同,在Swift中添加和乘以整数不会"环绕"或"截断",但如果结果不适合数据类型则会导致错误.
但是你可以使用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)
}
Run Code Online (Sandbox Code Playgroud)