栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#的浮点比较功能

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#的浮点比较功能

编写有用的通用浮点

IsEqual
非常非常困难,即使不是完全不可能的。您当前的代码将因严重失败
a==0
。在这种情况下,该方法的行为确实是一个定义问题,并且可以说,最好针对特定领域用例量身定制代码。

对于这种事情,您 确实非常需要 一个好的测试套件。这就是我在《浮点指南》中所做的事情,这就是我最后想出的(Java代码,应该足够容易翻译):

public static boolean nearlyEqual(float a, float b, float epsilon) {    final float absA = Math.abs(a);    final float absB = Math.abs(b);    final float diff = Math.abs(a - b);    if (a == b) { // shortcut, handles infinities        return true;    } else if (a == 0 || b == 0 || absA + absB < Float.MIN_NORMAL) {        // a or b is zero or both are extremely close to it        // relative error is less meaningful here        return diff < (epsilon * Float.MIN_NORMAL);    } else { // use relative error        return diff / (absA + absB) < epsilon;    }}

您还可以在网站上找到测试套件。

附录: c#中相同的代码用于双打(按问题要求)

public static bool NearlyEqual(double a, double b, double epsilon){    const double MinNormal = 2.2250738585072014E-308d;    double absA = Math.Abs(a);    double absB = Math.Abs(b);    double diff = Math.Abs(a - b);    if (a.Equals(b))    { // shortcut, handles infinities        return true;    }     else if (a == 0 || b == 0 || absA + absB < MinNormal)     {        // a or b is zero or both are extremely close to it        // relative error is less meaningful here        return diff < (epsilon * MinNormal);    }    else    { // use relative error        return diff / (absA + absB) < epsilon;    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/381888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号