は、JavaScriptの数値に変換するには、この機能を使用してください。 JavaScriptでは単精度数ではなく倍精度が使用されるため、丸めが発生することがあります。私はこれが役に立てば幸い
function real2Back(value){
if(isNaN(value))return [0,0xFFC0]
if(value==Number.POSITIVE_INFINITY || value>=3.402824e38)
return [0,0x7F80]
if(value==Number.NEGATIVE_INFINITY || value<=-3.402824e38)
return [0,0xFF80]
var negative=(value<0)
var p,x,mantissa
value=Math.abs(value)
if(value==2.0)return [0,0x4000]
else if(value>2.0){
// positive exponent
for(var i=128;i<255;i++){
p=Math.pow(2,i+1-127)
if(value<p){
x=Math.pow(2,i-127)
mantissa=Math.round((value*1.0/x)*8388608)
mantissa&=0x7FFFFF
value=mantissa|(i<<23)
if(negative)value|=(1<<31)
return [value&0xFFFF,(value>>16)&0xFFFF]
}
}
// return infinity
return negative ? [0,0xFF80] : [0,0x7F80]
} else {
for(var i=127;i>0;i--){
// negative exponent
p=Math.pow(2,i-127)
if(value>p){
x=p
mantissa=Math.round(value*8388608.0/x)
mantissa&=0x7FFFFF
value=mantissa|(i<<23)
if(negative)value|=(1<<31)
return [value&0xFFFF,(value>>16)&0xFFFF]
}
}
// subnormal
x=Math.pow(2,i-126)
mantissa=Math.round((value*8388608.0/x))
if(mantissa>0x7FFFFF)mantissa=0x800000
value=mantissa
if(negative)value|=(1<<31)
return [value&0xFFFF,(value>>16)&0xFFFF]
}
}
:
function back2Real(low, high){
var fpnum=low|(high<<16)
var negative=(fpnum>>31)&1;
var exponent=(fpnum>>23)&0xFF
var mantissa=(fpnum&0x7FFFFF)
if(exponent==255){
if(mantissa!=0)return Number.NaN;
return (negative) ? Number.NEGATIVE_INFINITY :
Number.POSITIVE_INFINITY;
}
if(exponent==0)exponent++;
else mantissa|=0x800000;
exponent-=127
var ret=(mantissa*1.0/0x800000)*Math.pow(2,exponent)
if(negative)ret=-ret;
return ret;
}
次の関数は、低域と高単語に分割、32ビットIEEE浮動小数点数にJavaScriptの数値を変換します。コードはパブリックドメインにあります。
私は数字がでているどのような形式「実」が何を意味するのかによって少し混乱していますか? IEEE浮動小数点? –
これは32ビットのIEEE浮動小数点数です。最初の引数は下位16ビットで、2番目の引数は上位16ビットです。私はすぐに質問に答えるJavaScript関数を作る過程にあります。 –