开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
3 Star 4 Fork 4

ToolGood/ToolGood.Algorithm

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (7)
标签 (27)
master
js-dev
java-dev
Fast
v3.5
v2.x
v1.x
6.0.0.8
6.0.0.0
5.0.0.2
3.5.0.3
3.4.1.4
3.4.1.3
3.4.0.0
3.3.0.0
3.2.0.2
3.2.0.1
3.0.3
3.0.2
3.0.1
3.0.0.0
2.2.0.2
2.2.0.1-java
2.2.0.1
2.2
2.1.0.1
2.1
master
分支 (7)
标签 (27)
master
js-dev
java-dev
Fast
v3.5
v2.x
v1.x
6.0.0.8
6.0.0.0
5.0.0.2
3.5.0.3
3.4.1.4
3.4.1.3
3.4.0.0
3.3.0.0
3.2.0.2
3.2.0.1
3.0.3
3.0.2
3.0.1
3.0.0.0
2.2.0.2
2.2.0.1-java
2.2.0.1
2.2
2.1.0.1
2.1
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (7)
标签 (27)
master
js-dev
java-dev
Fast
v3.5
v2.x
v1.x
6.0.0.8
6.0.0.0
5.0.0.2
3.5.0.3
3.4.1.4
3.4.1.3
3.4.0.0
3.3.0.0
3.2.0.2
3.2.0.1
3.0.3
3.0.2
3.0.1
3.0.0.0
2.2.0.2
2.2.0.1-java
2.2.0.1
2.2
2.1.0.1
2.1
Precision.js 6.16 KB
一键复制 编辑 原始数据 按行查看 历史
sshuicn 提交于 2026年02月07日 14:37 +08:00 . fix
/**
* Precision
*/
let Precision = {
/**
* Standard epsilon, the maximum relative precision of IEEE 754 double-precision floating numbers (64 bit).
* According to the definition of Prof. Demmel and used in LAPACK and Scilab.
*/
doublePrecision: Math.pow(2, -53),
/**
* Standard epsilon, the maximum relative precision of IEEE 754 double-precision floating numbers (64 bit).
* According to the definition of Prof. Higham and used in the ISO C standard and MATLAB.
*/
positiveDoublePrecision: 2 * Math.pow(2, -53),
/**
* Value representing 10 * 2^(-53) = 1.11022302462516E-15
*/
defaultDoubleAccuracy: Math.pow(2, -53) * 10,
/**
* Converts a double to a 64-bit integer representation
*/
doubleToInt64Bits: function(value) {
let buffer = new ArrayBuffer(8);
let float64Array = new Float64Array(buffer);
let int64Array = new BigInt64Array(buffer);
float64Array[0] = value;
return int64Array[0];
},
/**
* Converts a 64-bit integer representation to a double
*/
int64BitsToDouble: function(bits) {
let buffer = new ArrayBuffer(8);
let int64Array = new BigInt64Array(buffer);
let float64Array = new Float64Array(buffer);
int64Array[0] = bits;
return float64Array[0];
},
/**
* Increments a floating point number to the next bigger number representable by the data type.
* @param {number} value - The value which needs to be incremented.
* @param {number} count - How many times the number should be incremented.
* @returns {number} The next larger floating point value.
*/
increment: function(value, count = 1) {
if (isNaN(value) || !isFinite(value) || count === 0) {
return value;
}
// Translate the bit pattern of the double to an integer
let intValue = this.doubleToInt64Bits(value);
if (intValue < 0) {
intValue -= BigInt(count);
} else {
intValue += BigInt(count);
}
// Note that BigInt(-9223372036854775808) has the same bit pattern as -0.0
if (intValue === BigInt(-9223372036854775808)) {
return 0;
}
return this.int64BitsToDouble(intValue);
},
/**
* Evaluates the minimum distance to the next distinguishable number near the argument value.
* @param {number} value - The value used to determine the minimum distance.
* @returns {number} Relative Epsilon (positive double or NaN).
*/
epsilonOf: function(value) {
if (isNaN(value) || !isFinite(value)) {
return NaN;
}
let signed64 = this.doubleToInt64Bits(value);
if (signed64 === 0n) {
signed64++;
return this.int64BitsToDouble(signed64) - value;
}
if (signed64 < 0n) {
signed64--;
return this.int64BitsToDouble(signed64) - value;
}
signed64--;
return value - this.int64BitsToDouble(signed64);
},
/**
* Evaluates the minimum distance to the next distinguishable number near the argument value.
* @param {number} value - The value used to determine the minimum distance.
* @returns {number} Relative Epsilon (positive double or NaN).
*/
positiveEpsilonOf: function(value) {
return 2 * this.epsilonOf(value);
},
/**
* @param {number} a
* @param {number} b
* @param {number} diff
* @param {number} maximumError
* @returns {boolean}
*/
almostEqualNormRelative: function(a, b, diff, maximumError) {
// If A or B are infinity (positive or negative) then
// only return true if they are exactly equal to each other -
// that is, if they are both infinities of the same sign.
if (!isFinite(a) || !isFinite(b)) {
return a === b;
}
// If A or B are a NAN, return false. NANs are equal to nothing,
// not even themselves.
if (isNaN(a) || isNaN(b)) {
return false;
}
// If one is almost zero, fall back to absolute equality
if (Math.abs(a) < this.doublePrecision || Math.abs(b) < this.doublePrecision) {
return Math.abs(diff) < maximumError;
}
if ((a === 0 && Math.abs(b) < maximumError) || (b === 0 && Math.abs(a) < maximumError)) {
return true;
}
return Math.abs(diff) < maximumError * Math.max(Math.abs(a), Math.abs(b));
},
/**
* @param {number} a
* @param {number} b
* @returns {boolean}
*/
almostEqualRelative: function(a, b) {
return this.almostEqualNormRelative(a, b, a - b, this.defaultDoubleAccuracy);
},
/**
* @param {number} a
* @param {number} b
* @returns {boolean}
*/
almostEqual: function(a, b) {
return this.almostEqualNorm(a, b, a - b, this.defaultDoubleAccuracy);
},
/**
* @param {number} a
* @param {number} b
* @param {number} diff
* @param {number} maximumAbsoluteError
* @returns {boolean}
*/
almostEqualNorm: function(a, b, diff, maximumAbsoluteError) {
// If A or B are infinity (positive or negative) then
// only return true if they are exactly equal to each other -
// that is, if they are both infinities of the same sign.
if (!isFinite(a) || !isFinite(b)) {
return a === b;
}
// If A or B are a NAN, return false. NANs are equal to nothing,
// not even themselves.
if (isNaN(a) || isNaN(b)) {
return false;
}
return Math.abs(diff) < maximumAbsoluteError;
}
};
// 添加方法到 Number.prototype
Number.prototype.increment = function(count = 1) {
return Precision.increment(this, count);
};
Number.prototype.epsilonOf = function() {
return Precision.epsilonOf(this);
};
Number.prototype.positiveEpsilonOf = function() {
return Precision.positiveEpsilonOf(this);
};
Number.prototype.almostEqualRelative = function(other) {
return Precision.almostEqualRelative(this, other);
};
Number.prototype.almostEqual = function(other) {
return Precision.almostEqual(this, other);
};
export { Precision };
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

ToolGood.Algorithm是一个功能强大、轻量级、兼容Excel公式的算法类库,旨在提高开发人员在不同业务场景中的生产力。
暂无标签
未知许可证
查看未知开源许可协议
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C#
1
https://gitee.com/toolgood/ToolGood.Algorithm.git
git@gitee.com:toolgood/ToolGood.Algorithm.git
toolgood
ToolGood.Algorithm
ToolGood.Algorithm
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /