在游戏中实现IEEE754 32位单精度

时间:2018-02-09 01:55:01

标签: javascript combinations ieee-754 ieee

在目前流行的游戏中,CSGO还有一些项目。每个项目都分配了一个浮点值。每个项目都有最小浮动和最大浮动,如0-1或0.06-0.80。这些浮点数中的每一个都可以由IEEE754 32位单精度表示。游戏中有一个选项可以“换取”这些项目中的10个以创建一个新项目。当您交易10个项目时,结果项目的浮动可以计算为

(avg of 10 floats)*(maxwear-of-resulting-item - minwear-of-resulting-item) + minwear-of-resulting-item

我正在努力的是,因为CSGO使用IEEE754单精度,所以0.07777777等平均值通常最终为0.0777777731418609619140625。看起来您只需要使用上面等式的IEEE754值来获得实际的结果浮点数,但我有10个项目的组合,其中平均值为0.0777777746,应该是0.0777777731418609619140625但它结束了最新为0.077777780592441558837890625。这意味着CSGO正在进行的计算方式与我所知的方式或顺序不同。我已经尝试了使用IEEE754数字的每个组合,并取了10个项目的平均值并将它们放入我能想到的上述等式中,但我仍然无法找出适用于我抛出的10个项目的所有组合的函数在它。

到目前为止,我提出的最佳功能是:

function ieee32(x) {
  var float = new Float32Array(1);
  float[0] = x;
  return float[0];
}

function getFloat(arr, max, min, actual) {
    for (let i = 0; i < 10; i++) {
        arr[i] = ieee32(arr[i]);
    }
    let total = 0;
    for (let i = 0; i < 10; i++) {
        total += arr[i];
        total = ieee32(total);
    }
    console.log("JavaScript: " + ieee32((total/10)*(max-min)+min) + " Actual: " + actual + "\n\n")
}

getFloat([0.038998112082481,0.057681135833263,0.065524280071259,0.05766910687089,0.059865914285183,0.057671267539263,0.048783712089062,0.10741865634918,0.13450133800507,0.14966422319412], 1, 0, "0.07777778059244");
getFloat([0.1836509257555,0.35303607583046,0.27028855681419,0.37463894486427,0.22707445919514,0.24045088887215,0.16390900313854,0.23315590620041,0.16496440768242,0.3563985824585], 0.80, 0.06, "0.250000000000000");
getFloat([0.2002295255661,0.1854835152626,0.35854259133339,0.27182018756866,0.21729451417923,0.33144646883011,0.37027344107628,0.23222900927067,0.22164261341095,0.1786058396101], 0.80, 0.06, "0.2500000000000000");
getFloat([0.46830454468727,0.31111705303192,0.32107254862785,0.15711317956448,0.15612974762917,0.16205121576786,0.16290606558323,0.24679513275623,0.36448866128922,0.21758955717087], 0.80, 0.06, "0.250000029802322");

不幸的是,这只能给出两种组合的正确答案。有什么方法可以找到正确的计算顺序和/或它们如何使用IEEE754单精度32位表示?非常感谢任何建议!

0 个答案:

没有答案