此 VB6 操作的等效 C# 语句会产生问题

2023-12-29

我在 VB 中有这样的代码行:

Dim Sqrt As Double
Sqrt = Radius ^ 2 - (CenterX - X) ^ 2

上面语句中的参数传递的值如下:

X=  -7.3725025845036161 Double
CenterX =0.0            Double
Radius= 8.0             Double

执行上面的语句时,值Sqrt在下面:

Sqrt    9.646205641487505   Double

现在我使用以下代码编写了类似的 C# 逻辑Math class:

double Sqrt = 0;
Sqrt = Math.Pow(Radius, 2) - Math.Pow((CenterX - X), 2);

使用相同的一组值,输出C#代码是:

Sqrt    9.6462056414874979  double

我需要帮助,因为 C# 代码中的这一单一更改,我的所有值都受到了影响。我能做些什么来获得与*VB* source?


有一个VB6 和 .NET double 类型之间的精度差异 https://stackoverflow.com/a/10147491/40347。两者都是 IEEE 64 位双精度类型,但 .NET CLR 在内部使用 80 位扩展精度,即您的计算在 .NET 中会更准确。

如果您必须向后兼容 VB6 精度,您可以强制 FPU(浮点单元)使用(不太精确的)64 位值。这可以使用本机来实现_controlfp_s https://msdn.microsoft.com/en-us/library/c9676k6h.aspx功能。

下面是一个代码片段,您可以使用它来临时“降级”浮点精度以实现向后兼容性。你可以这样使用它:

Usage

// default floating point precision 

using (new FloatingPoint64BitPrecision())
{
    // floating-point precision is set to 64 bit
}

// floating-point precision is reset to default

代码片段

/// <summary>
/// This class changes floating-point precision to 64 bit
/// </summary>
internal class FloatingPoint64BitPrecision : IDisposable
{
    private readonly bool _resetRequired;

    public FloatingPoint64BitPrecision()
    {
        int fpFlags;
        var errno = SafeNativeMethods._controlfp_s(out fpFlags, 0, 0);
        if (errno != 0)
        {
            throw new Win32Exception(
                errno, "Unable to retrieve floating-point control flag.");
        }

        if ((fpFlags & SafeNativeMethods._MCW_PC) != SafeNativeMethods._PC_64)
        {
            Trace.WriteLine("Change floating-point precision to 64 bit");
            errno = SafeNativeMethods._controlfp_s(
                out fpFlags, SafeNativeMethods._PC_64, SafeNativeMethods._MCW_PC);

            if (errno != 0)
            {
                throw new Win32Exception(
                    errno, "Unable to change floating-point precision to 64 bit.");
            }

            _resetRequired = true;
        }
    }

    public void Dispose()
    {
        if (_resetRequired)
        {
            Trace.WriteLine("Resetting floating-point precision to default");
            SafeNativeMethods._fpreset();
        }
    }
}

internal static class SafeNativeMethods
{
    [DllImport("msvcr120.dll")]
    public static extern void _fpreset();

    [DllImport("msvcr120.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int _controlfp_s(
        out int currentControl, int newControl, int mask);

    public static int _CW_DEFAULT = 
        (_RC_NEAR | _PC_53 | _EM_INVALID | _EM_ZERODIVIDE | _EM_OVERFLOW 
        | _EM_UNDERFLOW | _EM_INEXACT | _EM_DENORMAL);

    public const int _MCW_EM = 0x0008001f;          // interrupt Exception Masks 
    public const int _EM_INEXACT = 0x00000001;      //   inexact (precision) 
    public const int _EM_UNDERFLOW = 0x00000002;    //   underflow 
    public const int _EM_OVERFLOW = 0x00000004;     //   overflow 
    public const int _EM_ZERODIVIDE = 0x00000008;   //   zero divide 
    public const int _EM_INVALID = 0x00000010;      //   invalid 
    public const int _EM_DENORMAL = 0x00080000;     // denormal exception mask 
                                                    // (_control87 only) 

    public const int _MCW_RC = 0x00000300;          // Rounding Control 
    public const int _RC_NEAR = 0x00000000;         //   near 
    public const int _RC_DOWN = 0x00000100;         //   down 
    public const int _RC_UP = 0x00000200;           //   up 
    public const int _RC_CHOP = 0x00000300;         //   chop 

    public const int _MCW_PC = 0x00030000;          // Precision Control 
    public const int _PC_64 = 0x00000000;           //    64 bits 
    public const int _PC_53 = 0x00010000;           //    53 bits 
    public const int _PC_24 = 0x00020000;           //    24 bits 

    public const int _MCW_IC = 0x00040000;          // Infinity Control 
    public const int _IC_AFFINE = 0x00040000;       //   affine 
    public const int _IC_PROJECTIVE = 0x00000000;   //   projective 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

此 VB6 操作的等效 C# 语句会产生问题 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • NativeBase + 指数标头

    我正在使用 NativeBase 和 Exponent 标题位于手机状态栏下方 您可以在本地库 https getexponent com community native baseExponent 发布的演示 有人能解决这个问题吗 由于此
  • 无法从初始 URI 检索初始集群分区 [RedisURI [host='127.0.0.1', port=7001]]

    我正在开发 Lettuce 集群 Java 客户端 它设置在一个bolt拓扑 Apache Strom spout正在读取数据kafka并将其传递给bolt 但是 当我开始拓扑时 我收到以下错误消息并且程序终止 我错过了什么吗 是什么原因造
  • 猴子补丁节点模块

    我正在尝试猴子补丁该节点模块 https github com johnvmt node desktop screenshot in electron https electronjs org 应用 我想改变capture方法输入参数 到目
  • Angular 6 angular.json 在配置中添加 ssl

    我想通过 SSL 为我的应用程序提供服务 之前我有这个脚本 ng serve ssl ssl key pathtokey key crt 我想在新的 angular json 中添加 SSL 但是当我尝试添加它时出现错误 Schema va
  • codemirror - 与代码重叠的行号

    我正在使用最新的 codemirror v5 49 0 对于我的电子文本编辑器应用程序 有时行号会与文本重叠呈现 无法重现该错误 因为它并不总是发生 通过多次刷新应用程序即可轻松重现 有人有主意吗 或者这对您来说可能是一个已知问题 我也遇到
  • Spring Boot、Thymeleaf 和 @Controller

    我正在使用 Spring Boot 但有些东西我不太明白 我有2个 Controller在我的应用程序中 第二个并没有真正接收 REST 调用 Thymeleaf 正在跳转请求 基本上我所拥有的是 Configuration Compone
  • MSDeploy安装Windows服务?

    我们有一个使用 NServiceBus 发布事件的网站 该站点是使用 msdeploy 部署的 我们还有 NServiceBus exe 它应该作为 Windows 服务运行来订阅这些事件 我们也想部署它 有什么方法可以将服务和网站打包在一
  • `getElementById` 返回 null [重复]

    这个问题在这里已经有答案了 一个案例document getElementById返回null 我已经阅读了 SO 中的其他四个问题 并阅读了 MDN 上的参考资料 但我不知道出了什么问题 请帮我 代码如下 HTML
  • WPF Canvas,如何使用MVVM代码动态添加子项

    要求 根据点的集合绘制一个位图图像和矩形 矩形应完全适合图像上的像素位置 还需要在矩形内添加一些文本 图像始终只有一张 并且矩形将动态添加 目前的解决方案 有一个带有图像控制的画布 在代码隐藏文件ViewImageResult xaml c
  • 如何在 Geodjango/GEOS 中将公里转换为度?

    我正在使用 GEOS API 中的 缓冲区 方法根据 GeoDjango 中的点和半径创建一个圆 根据这个答案 GeoDjango 如何根据点和半径创建圆 https stackoverflow com questions 4985222
  • @Async 不适用于 Spring API 中的接口

    我正在使用 Async 使用 hibernate 在数据库中并行存储一些数据 我需要这样做 因为在将信息保存到数据库之前 我需要运行一些需要几分钟的任务 所以我实现了 Async 问题是 Async 似乎不起作用 请找到下面的代码 网页配置
  • 如何迭代 std::set?

    我有这个代码 std set
  • 无论如何,有没有办法“探测”common lisp 中的方法

    我的应用程序允许用户间接创建自己的方法 稍后我需要引用这些方法 我想知道是否有一种方法 用于错误检查目的 来测试方法是否存在而不尝试执行它 如果我只是尝试调用该方法但它不存在 这将使我的应用程序崩溃 另请参阅函数 FIND METHOD h
  • 如何在 Windows 操作系统上查找计算机上安装的 JVM 是 HotSpot 还是 JRockit

    如何确定 Windows 机器上安装的 JVM 是 HotSpot 还是 JRockit 还是来自任何其他供应商 在终端中运行此命令 java XshowSettings properties version
  • 尽管我只定义了 X 一次,但在 C 中出现“首先在此处定义了‘X’的多重定义”错误

    尽管我仍然收到错误 但我的所有文件中只有一个名称 代码 的定义 我尝试使用 pragma Once 和 ifndef 但没有成功 这是我收到的错误 marcin marcin VirtualBox Pulpit INA Wst p Laby
  • 我可以在不使用麦克风的情况下录制

    我有一个
  • 使用 C++ 和 Visual Studio 2008 设置 OpenGL

    嘿 我想知道是否有关于如何设置这个的好的教程 我已经在 gamedev net 上看过 NeHe 教程 但其中一些似乎已经过时了 有什么线索吗 thanks NeHe http nehe gamedev net可能有点旧 但绝对不会过时 与
  • 在 Django 管理中禁用选择列表,仅用于编辑

    我想在编辑对象时禁用某些字段 我已经设法对文本字段执行此操作 但对于下拉列表 选择列表 来说这是不可能的 我正在表单的构造函数中执行此操作 class OrderModelForm forms ModelForm def init self
  • 带圆角和背景颜色的 NSButton

    我想要一个简单的按钮 带有圆角的按钮 并为其添加背景 我尝试过两件事 1 使用圆形按钮图像 这工作得很好 直到我需要缩放按钮 这导致圆形部分看起来很难看 2 扩展按钮并为其添加颜色 但是当我单击按钮时遇到麻烦 我希望 推动 状态与 常规 状
  • 此 VB6 操作的等效 C# 语句会产生问题

    我在 VB 中有这样的代码行 Dim Sqrt As Double Sqrt Radius 2 CenterX X 2 上面语句中的参数传递的值如下 X 7 3725025845036161 Double CenterX 0 0 Doubl