1

问题:是否可以在 Small 和 Visual Basic 中制作双浮点值?


我一直在尝试在 Small/Visual Basic 中创建一个双浮点值(就像在它们两者中一样)......
而且我一直没有运气......我总是以这样的错误终止:

    at System.Decimal..ctor(Double value)
    at System.Decimal.op_Explicit(Double value)
    at Microsoft.SmallBasic.Library.Primitive.op_Implicit(Double value)
    at _SmallBasicProgram._Main()

或者,在 Visual Basic 中运行:

overflow


那么,有没有办法使双非整数(十进制)精度浮点数?
代码(我试过)是:

Small Basic:

var1 = 18446744073709551615
var2 = 1797693134862315800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

(是的,很抱歉零的数量。它是 303 个。)

Visual Basic 中:

Module experiment_doesDoubleFloat_workModule
    Dim var1, var2 As Double
    Sub Main()
        var1 = 18446744073709551615
        var2 = 1797693134862315800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    End Sub
End Module

我在搞砸什么吗?
我也不知道哪些标签实际上适合这个......(除了 smallbasic 标签)

4

2 回答 2

3

这不起作用的原因是因为您有效地为编译器提供了一个Integer格式常量,并且编译器正试图将您的巨大整数转换为浮点值。这会失败,因为您的 >300 位值大于适合任何标准数据类型的最大整数。

如果你想在你的代码中分配一个常量值,它必须是编译器可以解析的格式,即:

 var1 = 1.8446744073709552E+19
 var2 = 1.7976931348623157E+308

实际上,您会注意到,当您键入 :

 var1 = 1.8446744073709551615E+19

该值将自动转换为:

 var1 = 1.8446744073709552E+19

因为原始值包含的精度超过了double格式所能容纳的精度。另外,我没有计算您的代码示例中零的数量,但如果是 303 个,那么这会使 的值var2 = 1.797... E+319,对于 a 来说也太大了double。如上所述, 292 个零值变为...E+308,这是最大的可表示的双精度浮点值。

请注意,只要代码中的值足够小以适合Integer. 看到:

var1 = 9223372036854775807  ' << largest Int64

编译得很好,但还有一个

var1 = 9223372036854775808

失败。


进一步阅读

每个计算机科学家都应该知道的关于浮点运算的知识

于 2014-06-12T13:34:36.580 回答
0

如果是为了自动化,试试这个:

 Public Function REAL_to_DOUBLE(ByVal i3264 As Long) '
        Dim sBit As Integer = 1
        Dim expBits As Integer = 8 'for 32 bits, 11 for 64 bits
        Dim expAux As Integer = 127 'for 32 bts, 1023 for 64 bits
        Dim nBits As Integer = 32 ' for 23 bits, 64 for 64 bits
        Dim dec As Double = 1

        Dim hexstring As String = Hex(i3264)

        If hexstring.Length > 8 Then
            expBits = 11
            nBits = 64
            expAux = 1023
        End If

        Dim bin_ As String
        If nBits = 32 Then
            bin_ = Convert.ToString(Convert.ToInt32(hexstring, 16), 2).PadLeft(nBits, "0"c)
        Else
            bin_ = Convert.ToString(Convert.ToInt64(hexstring, 16), 2).PadLeft(nBits, "0"c)
        End If
        Dim _sinal As Integer = -1
        If (bin_.Substring(0, 1)) = "0" Then _sinal = 1

        Dim _e As String = bin_.Substring(1, expBits).PadLeft(expBits, "0"c)
        Dim a As Integer = Convert.ToInt32(_e, 2)
        Dim exp_ As Integer = a - expAux

        Dim matissa As String = bin_.Substring(expBits + 1, bin_.Length - (expBits + 1))

        Dim length As Integer = Len(matissa)
        Dim ps As Long = 2
        For x As Integer = 0 To length
            Dim temp As Integer = Val(Mid(matissa, x + 1, 1))

            If temp = 1 Then
                dec += temp / ps
            End If
            ps *= 2
        Next

        dec = _sinal * 2 ^ (a - expAux) * dec

        Return dec
    End Function
于 2018-12-12T22:57:51.887 回答