【发布时间】:2021-09-03 20:11:27
【问题描述】:
鉴于我想用 Rust 中的以下函数将系列的前 n 项 1,2,3,.. 相加
fn sum_sequence(x: u64) -> u64
{
let mut s: u64 = 0;
for n in 1..=x
{
s = s + n;
}
return s;
}
当我为 x64 架构编译它时
cargo build --release
并使用x=10000000000 运行它,结果是13106511857580896768 - 很好。
但是当我把这个函数编译成 Webassembly (WASM)
cargo build --target wasm32-unknown-unknown --release
并使用与之前相同的参数运行它,x=10000000000,
wasmtime ./target/wasm32-unknown-unknown/release/sum_it.wasm --invoke sum_sequence 1000000000
那么结果是-5340232216128654848。
与将 Rust 编译为 WASM 相比,我没有预料到将 Rust 编译为 x64 的结果会有任何偏差。另外,从 WASM 文本文件(如下)中,我不明白为什么在使用 WASM 运行它时会得到否定结果。
WASM 显示不同的结果是怎么来的,我能做些什么来纠正 WASM 的计算?
(module
(type (;0;) (func (param i64) (result i64)))
(func $sum_sequence (type 0) (param i64) (result i64)
(local i64 i64 i32)
block ;; label = @1
local.get 0
i64.eqz
i32.eqz
br_if 0 (;@1;)
i64.const 0
return
end
i64.const 1
local.set 1
i64.const 0
local.set 2
block ;; label = @1
loop ;; label = @2
local.get 1
local.get 2
i64.add
local.set 2
local.get 1
local.get 1
local.get 0
i64.lt_u
local.tee 3
i64.extend_i32_u
i64.add
local.tee 1
local.get 0
i64.gt_u
br_if 1 (;@1;)
local.get 3
br_if 0 (;@2;)
end
end
local.get 2)
(table (;0;) 1 1 funcref)
(memory (;0;) 16)
(global (;0;) (mut i32) (i32.const 1048576))
(global (;1;) i32 (i32.const 1048576))
(global (;2;) i32 (i32.const 1048576))
(export "memory" (memory 0))
(export "sum" (func $sum))
(export "__data_end" (global 1))
(export "__heap_base" (global 2)))
【问题讨论】:
标签: rust webassembly