stuncloud/UWSCR

chknumでint型の範囲を超えると正しく判定されない

Closed this issue · 4 comments

概要

タイトルの通り

再現スクリプト

print chknum(2147483648) //false

再現手順

No response

バージョン

1.0.0

不具合発生環境

Windows 10

UWSCの動作に合わせる
要調査

  • 上限があるかどうか

こちらで確認してみたUWSCの挙動です。ご参考までです。

a = 999999999999999
print chknum(a)     // true
print chknum(a + 1) // false
print chknum(a - 1) // true
print 999999999999999 + 1 // 1E15
print 999999999999999 - 1 // 999999999999998

b = 1000000000000000
print chknum(b) // false
print b // 1E15

c = "1000000000000000"
print chknum(c) // true 
print chknum(val(c)) // false
print val(c) // 1E15

調査報告いただきありがとうございます
文字列の挙動が謎ですね、このあたりはVARIANTの仕様も絡みそうです

UWSCRの数値はf64 (UWSCでいうところのdouble) なのでその範囲であればtrueを返すこととします
どのみちそこを超えると数値としては扱えず、val()との整合性も考えるとそういう仕様にするしかないですね

引数をi32ではなくf64として受けた場合の動作

a = 999999999999999
print chknum(a)           // True
print chknum(a + 1)       // True
print chknum(a - 1)       // True
print 999999999999999 + 1 // 1000000000000000
print 999999999999999 - 1 // 999999999999998

b = 1000000000000000
print chknum(b)           // True
print b                   // 1000000000000000

c = "1000000000000000"
print chknum(c)           // True
print chknum(val(c))      // True
print val(c)              // 1000000000000000

UWSCでは数値扱いでなかったものも数値扱いとなるのでむしろ良さそう
これを修正とします