意外下溢

Unexpected underflow

//Data
var M = 83 * (10 ^ (-5));
var R = 2077;
var Th = 1087;
var Tk = 372;
var Tr = 667;
var a = 90;
var Vclc = 9.135 * (10 ^ (-6));
var Vcle = 7.733 * (10 ^ (-6));
var Vswe = 6.105 * (10 ^ (-5));
var Vswc = 6.294 * (10 ^ (-5));
var Vk = 5.606 * (10 ^ (-6));
var Vr = 19.308 * (10 ^ (-6));
var Vh = 5.606 * (10 ^ (-6));

var ρ = ((2 * Vclc + 2 * Vk + Vswc) / (2 * Tk)) + ((Vr * Math.log(Th / Tk)) / (Th - Tk)) + ((2 * Vcle + 2 * Vh + Vswe) / (2 * Th));
console.log(ρ);
console.log(ρ < Number.MIN_VALUE);

当我在 CodePen 中 运行 这段代码时,我在控制台中得到:-1.4626799636897467 和 true,我认为这意味着存在下溢。但是,ρ 的值应该类似于 k*10^-10,其中 k 在 2000 左右是恒定的。因为 Javascript 中可以表示的最小正数是 5e-324,这比我的小得多值,为什么会出现下溢?如果这不是下溢,我不明白正数之和如何导致负数...

注意:我使用此处提供的信息来检查下溢:How to detect numeric overflow/underflow in JavaScript arithmetic operations? and JavaScript MIN_VALUE Property

^是按位异或,不是求幂。

您可以使用指数表示法输入 10 的字面幂。xxxEyyxxx * 10^yy

//Data
var M = 83e-5;
var R = 2077;
var Th = 1087;
var Tk = 372;
var Tr = 667;
var a = 90;
var Vclc = 9.135e-6;
var Vcle = 7.733e-6;
var Vswe = 6.105e-5;
var Vswc = 6.294e-5;
var Vk = 5.606e-6;
var Vr = 19.308e-6;
var Vh = 5.606e-6;

var ρ = ((2 * Vclc + 2 * Vk + Vswc) / (2 * Tk)) + ((Vr * Math.log(Th / Tk)) / (Th - Tk)) + ((2 * Vcle + 2 * Vh + Vswe) / (2 * Th));
console.log(ρ);
console.log(ρ < Number.MIN_VALUE);

你的代码中得到true的原因是因为Number.MIN_VALUE是最小的正数,但是你的结果是负数。如果要测试下溢,需要检查p的绝对值是否小于Number.MIN_VALUE.

但是由于小于此的数字无法用 Javascript 浮点数表示,因此除了 0.

之外,测试实际上永远不会成立。