加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

OverflowException仅在VB.net中,而不在C#中

发布时间:2020-12-17 07:24:58 所属栏目:百科 来源:网络整理
导读:出于自我教育目的,我试图找到一种方法来创建一个自己的高度图. 我google了一下,发现了一个创建伪随机数的函数. public static float Noise(int x) { x = (x 13) ^ x; return (1f - ((x * (x * x * 15731 + 789221) + 1376312589) 0x7FFFFFFF) / 1073741824.0
出于自我教育目的,我试图找到一种方法来创建一个自己的高度图.
我google了一下,发现了一个创建伪随机数的函数.

public static float Noise(int x)
    {
        x = (x << 13) ^ x;

        return (1f - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7FFFFFFF) / 1073741824.0f);
    }

由于我选择的语言是VB.net,我将此函数翻译为:

Private Function Noise(ByVal x As Integer) As Double
    x = (x << 13) Xor x

    Return (1.0R - ((x * (x * x * 15731.0R + 789221.0R) + 1376312589.0R) And &H7FFFFFFF) / 1073741824.0R)
End Function

如果我使用C#版本,我得到x值从1到100的结果.如果我使用VB.net版本,我得到x <6的值,但是x = 6的OverFlowException.当我拆开这个功能的部分时,我发现了溢出的部分

(x * x * 15731.0R)

所以,我的第一个问题是:为什么我在VB.net中获得了OverflowException而在C#中没有?如果中间结果对于包含变量来说太大,那么无论我使用何种语言,它都应该太大.

我的第二个问题是:我还能做些什么才能让它在VB.net中运行?

谢谢您的回答.

解决方法

Why do I get an OverflowException in VB.net but not in C#?

因为VB项目默认检查溢出,而C#没有.如果要将项目设置为检查溢出或将代码放在已检查的{}块中,您将在C#中看到相同的异常:

public static float Noise(int x)
{
    x = (x << 13) ^ x;
    checked{
        return (1f - ((x * (x * x * 15731) + 1376312589) & 0x7FFFFFFF) / 1073741824.0f);
    }
}

What can I do to make it work in VB.net as well?

我怀疑它对C#“有用”.由于它无声地溢出,你可能会得到不正确的结果.

但是,您可以通过将x转换为double来防止溢出:

Private Function Noise(ByVal x As Integer) As Double
    x = (x << 13) Xor x

    Dim y As Double = x

    Return (1.0R - ((y * (y * y * 15731.0R) + 1376312589.0R) And &H7FFFFFFF) / 1073741824.0R)
End Function

您还可以打开VB项目的“删除整数溢出检查”属性,但这是项目范围设置. VB目前没有办法关闭像C#那样的特定代码行的溢出检查.

无论你做什么,我都会彻底测试它,因为你正在计算一个浮点值,对它进行位掩码(和& H7FFFFFFF)然后除以另一个浮点值.混合整数和浮点数学可能非常棘手.

另请注意,您的两个代码段并不等效.当VB返回Double时,C#函数返回一个浮点数.你在VB中使用浮点文字但在C#中使用整数文字.它似乎不是一个很大的区别,但它可以意外地改变数学.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读