簡體   English   中英

使用NodeJS N-API計算浮點值時出現問題

[英]Issue while calculating float value using NodeJS N-API

大家好,

來自網絡開發者世界。 我目前正在嘗試執行一些C代碼,該代碼將RGB值轉換為XYZ值,NodeJS可通過N-API使用它。 我有一個關於浮動計算的問題 以下是我的問題的解釋:

基於下面的C代碼,此代碼正在嘗試將RGB值轉換為XYZ值。

char * colorType = getStringValue(env, funcParams[2], SPACELen);
// m is either the value srgb | adobeRgb
Matrix m = getEnumFromStr(colorType);
Rgb * rgb = getRGBFromJSObj(env, funcParams[0]);
xyz = generateXyzFromRgb(rgb, m);

我正在使用這個JS片段來調用我的庫

const rgb = {
  r: 255,
  g: 255,
  b: 255
};

const xyz = lib.getXyzFromRgb(rgb, "srgb", 10000);
expect(xyz).to.be.deep.equal({
  x: 0.9504,
  y: 1,
  z: 1.0888
});

如果一切正常,輸出應該像下面的一樣

{
 x: 0.9504,
 y: 1,
 z: 1.0888 
}

但是我的輸出是這個

{
 x: 0.9502,
 y: 0.9997,
 z: 1.0886 
}

如您所見,輸出完全錯誤。 但是,此錯誤輸出僅在我的本地計算機(OSX)上發生,並且僅在我嘗試使用JS代碼段進行轉換時發生。

確實,當我嘗試直接通過Xcode使用下面的這段代碼運行轉換時, 輸出是正確的

// RGB and & m variable is outputing the same value as the conversion done by the C code above
xyz = generateXyzFromRgb(rgb, m);

而且,當我試圖通過travis調用JS代碼時,travis也運行OSX;在Ubuntu上通過Docker調用JS代碼也輸出正確的值

它與硬件或我的庫編譯方式是否更相關?

先感謝您。

在javascript v8引擎中。 實際上只存在smi和double。 readFloatBE:當float傳遞給v8時,float將被強制轉換為double。 當您外出並四舍五入時,它將提升為兩倍。

首先,如果您確實想要獲得C之類的值,則需要手動指定四舍五入的數字,並使用四舍五入的Number.prototype.toPrecision函數重新實例化Number對象:

供你參考:

var v = 5.2
var buffer = new Buffer(5)
buffer.writeFloatBE(v)
var g = buffer.readFloatBE()

console.log(v)
console.log(g)
console.log(v==g)
console.log(Number(g.toPrecision(5)))

事實上,作為后由user10683038 JavaScript的數字是64位。

當我對該功能進行編碼時,所使用的數字類型為float(乍一看,我並沒有考慮制作Node模塊)。 后來我決定使用如下所示的小型util方法將float轉換為double

double v = *(double *) arg;
status = napi_create_double(env, v, &value);

奇怪的是,在執行此轉換時,我可能會隨機失去小數精度 ,而本來就不應該(從32bit到64bit),否則我可能會漏掉一些東西。

稍后,我重構相同的代碼,但是這次使用double來重構,它可以正常工作。 非常感謝大家。

注意 :當我在NodeJS綁定代碼庫中使用上述方法中的util代碼時,我很驚訝我之前沒有十進制精度錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM