¿La comparación numérica, entre BigInt y Number, forzará un argumento a BigInt, o forzará un argumento a Number?
Por ejemplo, en lo siguiente, ¿ 3n está forzado a 3 o 1 está forzado a 1n ?
console.log(3n > 1) // true Ambos operandos parecen convertirse en un "valor matemático" en 4.k de la operación abstracta IsLessThan ; un proceso que se designa ℝ en la especificación .
No tengo idea de lo que esto significa, sin embargo.
Observo que:
console.log(19_999_999_999_999_998 > 19_999_999_999_999_999n) // trueQuizás el "valor matemático", ℝ, de 19,999,999,999,999,998, es el descriptor del valor 20,000,000,000,000,000, ¿cuál es la representación IEEE754 más cercana posible?
Todavía no entiendo si se puede decir que se produce coerción, dado que un Número puede tener un componente fraccionario y un BigInt no.
¿La comparación numérica entre BigInt y Number forzará un argumento a BigInt, o forzará un argumento a Number?
Ninguno de los dos. A medida que lee en la especificación, se comparan sus valores matemáticos.
Considere 2n < 2.4 . Si ambos se convirtieron a BigInt, obtendría una excepción (" no se puede convertir un número no entero a BigInt ") o obtendría un resultado false porque 2n no es más pequeño que 2n . Pero no, el resultado true porque "ℝ( 2n ) < ℝ( 2.4 )" es "2 < 2.4", lo cual es verdadero.
Considere 9007199254740993n > 9007199254740992 . Si ambos se convirtieron a valores numéricos, obtendría un resultado false porque 9007199254740993 es mayor que Number.MAX_SAFE_INTEGER y pierde precisión, convirtiéndose en el valor 9007199254740992 , que no es mayor que 9007199254740992 . Pero no, el resultado true porque "ℝ( 9007199254740993n ) > ℝ( 9007199254740992 )" es "9007199254740993 > 9007199254740992", lo cual es verdadero.
¿Quizás el "valor matemático", ℝ, es la representación IEEE754 más cercana posible?
No, ese es el valor numérico de x , también indicado como 𝔽( x ) , que se convierte de un valor matemático (los números reales ) o un valor matemático extendido (los números reales más dos infinitos) a un valor concreto (números reales más dos infinitos) concreto (IEEE 754 flotante de precisión doble). punto) Valor numérico . Los valores matemáticos son abstractos y hay muchos números reales que no se pueden representar con precisión como BigInt o Number.
Debido a que forzar valores numéricos y valores BigInt puede provocar una pérdida de precisión, se recomienda lo siguiente:
Solo use un valor BigInt cuando se esperen razonablemente valores superiores a 2^53. No fuerce entre valores BigInt y valores numéricos.
El BigInt se convierte en un Number (lo que puede conducir a la pérdida de precisión).
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt
ACTUALIZAR:
Para 3n > 1
Bytecode length: 11 Parameter count 6 Register count 2 Frame size 16 OSR nesting level: 0 Bytecode Age: 0 16 S> 0x28001122e @ 0 : 13 00 LdaConstant [0] 0x280011230 @ 2 : c2 Star1 0x280011231 @ 3 : 0d 01 LdaSmi [1] 20 E> 0x280011233 @ 5 : 6d f9 00 TestGreaterThan r1, [0] 0x280011236 @ 8 : c3 Star0 0x280011237 @ 9 : 0e LdaUndefined 24 S> 0x280011238 @ 10 : a8 Return Constant pool (size = 1) 0x2800111c9: [FixedArray] in OldSpace - map: 0x0a554d7412c1 <Map> - length: 1 0: 0x0002800111e1 <BigInt 3> Handler Table (size = 0) Source Position Table (size = 8) 0x000280011241 <ByteArray[8]> Para TestGreaterThan , parece que compara dos matrices fijas (BigInt & Int)