Function SVtoTemp(V As Double) As Double 'V为mV单位'电压值转温度 S型热电偶反函数
 
'(-235mV~1874)
 Dim d1(10) As Double
 d1(0) = 0
 d1(1) = 0.18494946
 d1(2) = -0.0000800504062
 d1(3) = 0.00000010223743
 d1(4) = -1.52248592E-10
 d1(5) = 1.88821343E-13
 d1(6) = -1.59085941E-16
 d1(7) = 8.2302788E-20
 d1(8) = -2.34181944E-23
 d1(9) = 2.7978626E-27
 '(1874~10332)
 Dim d2(10) As Double
 d2(0) = 1.291507177
 d2(1) = 0.1466298863
 d2(2) = -0.00001534713402
 d2(3) = 3.145945973E-09
 d2(4) = -4.163257839E-13
 d2(5) = 3.187863771E-17
 d2(6) = -1.2916375E-21
 d2(7) = 2.183475087E-26
 d2(8) = -1.447379511E-31
 d2(9) = 8.211272125E-36
'(10332~17536)
 Dim d3(6) As Double
 d3(0) = -8.087801117
 d3(1) = 0.1621573104
 d3(2) = -0.000008536869453
 d3(3) = 4.719686976E-10
 d3(4) = -1.441693666E-14
 d3(5) = 2.08161889E-19
 '(17536~18694)
 Dim d4(5) As Double
 d4(0) = 53338.75126
 d4(1) = -1.235892298
 d4(2) = 0.001092657613
 d4(3) = -4.265693686E-08
 d4(4) = 6.24720542E-13Dim Temp As Double
Temp = 0If V < 1874 Then
 For i = 0 To 9
 Temp = Temp + d1(i) * V ^ i
 Next
 ElseIf V >= 1874 And V < 10332 Then
 For i = 0 To 9
 Temp = Temp + d2(i) * V ^ i
 Next
 ElseIf V >= 10332 And V < 17536 Then
 For i = 0 To 5
 Temp = Temp + d3(i) * V ^ i
 Next
 
ElseIf V >= 17536 Then
 For i = 0 To 4
 Temp = Temp + d4(i) * V ^ i
 NextEnd If
SVtoTemp = Temp
End Function

解决方案 »

  1.   

    检查你的常数表,多用几种基准温度计做对照。给你另外一种风格的代码。Dim d(9) As Double
    Dim i As IntegerFunction SVtoTemp(V As Double) As Double
    Dim Temp As DoubleIf (V < -235) Or (V > 18694) Then Exit FunctionIf V < 1874 Then
     d(0) = 0
     d(1) = 0.18494946
     d(2) = -0.0000800504062
     d(3) = 0.00000010223743
     d(4) = -1.52248592E-10
     d(5) = 1.88821343E-13
     d(6) = -1.59085941E-16
     d(7) = 8.2302788E-20
     d(8) = -2.34181944E-23
     d(9) = 2.7978626E-27
    ElseIf (V >= 1874) And (V < 10332) Then
     d(0) = 1.291507177
     d(1) = 0.1466298863
     d(2) = -0.00001534713402
     d(3) = 3.145945973E-09
     d(4) = -4.163257839E-13
     d(5) = 3.187863771E-17
     d(6) = -1.2916375E-21
     d(7) = 2.183475087E-26
     d(8) = -1.447379511E-31
     d(9) = 8.211272125E-36
    ElseIf (V >= 10332) And (V < 17536) Then
     d(0) = -8.087801117
     d(1) = 0.1621573104
     d(2) = -0.000008536869453
     d(3) = 4.719686976E-10
     d(4) = -1.441693666E-14
     d(5) = 2.08161889E-19
     d(6) = 0
    Else
     d(0) = 53338.75126
     d(1) = -1.235892298
     d(2) = 0.001092657613
     d(3) = -4.265693686E-08
     d(4) = 6.24720542E-13
     d(5) = 0
    End IfFor i = 0 To 9
     If (i > 0) And (d(i) = 0) Then Exit For
     Temp = Temp + d(i) * V ^ i
    Next iSVtoTemp = Temp
    End Function
      

  2.   

    对#1的代码加了运算过程的调试输出Sub Main()
        SVtoTemp 1000
        SVtoTemp 10000
        SVtoTemp 15000
        SVtoTemp 18000
    End SubFunction SVtoTemp(V As Double) As Double
        Dim d(9)        As Double
        Dim i           As Integer
        Dim Temp        As Double
        Dim lMax        As Long
        
        If (V < -235) Or (V > 18694) Then Exit Function    Debug.Print "== " & V & "=="
        If V < 1874 Then
            lMax = 9
            d(0) = 0
            d(1) = 0.18494946
            d(2) = -0.0000800504062
            d(3) = 0.00000010223743
            d(4) = -1.52248592E-10
            d(5) = 1.88821343E-13
            d(6) = -1.59085941E-16
            d(7) = 8.2302788E-20
            d(8) = -2.34181944E-23
            d(9) = 2.7978626E-27
        ElseIf (V < 10332) Then
            lMax = 9
            d(0) = 1.291507177
            d(1) = 0.1466298863
            d(2) = -0.00001534713402
            d(3) = 3.145945973E-09
            d(4) = -4.163257839E-13
            d(5) = 3.187863771E-17
            d(6) = -1.2916375E-21
            d(7) = 2.183475087E-26
            d(8) = -1.447379511E-31
            d(9) = 8.211272125E-36
        ElseIf (V < 17536) Then
            lMax = 6
            d(0) = -8.087801117
            d(1) = 0.1621573104
            d(2) = -0.000008536869453
            d(3) = 4.719686976E-10
            d(4) = -1.441693666E-14
            d(5) = 2.08161889E-19
            d(6) = 0
        Else
            lMax = 5
            d(0) = 53338.75126
            d(1) = -1.235892298
            d(2) = 0.001092657613
            d(3) = -4.265693686E-08
            d(4) = 6.24720542E-13
            d(5) = 0
        End If    For i = 0 To lMax
            Temp = Temp + d(i) * V ^ i
            Debug.Print i & ": " & Temp
        Next i    SVtoTemp = Temp
    End Function
    下面是输出结果,因为精度的原因,d3/d4最后一步的运算对结果毫无影响
    == 1000==
    0: 0
    1: 184.94946
    2: 104.8990538
    3: 207.1364838
    4: 54.8878918
    5: 243.7092348
    6: 84.6232938
    7: 166.9260818
    8: 143.5078874
    9: 146.30575
    == 10000==
    0: 1.291507177
    1: 1467.590370177
    2: -67.1230318229999
    3: 3078.822941177
    4: -1084.434897823
    5: 2103.428873177
    6: 811.791373176999
    7: 1030.138881877
    8: 1015.665086767
    9: 1023.876358892
    == 15000==
    0: -8.087801117
    1: 2424.271854883
    2: 503.476227958
    3: 2096.370582358
    4: 1366.5131639455
    5: 1524.58609840488
    6: 1524.58609840488
    == 18000==
    0: 53338.75126
    1: 31092.689896
    2: 385113.756508
    3: 136338.50074048
    4: 201919.164357472
    5: 201919.164357472
    未完待续...
      

  3.   

    本来想改为Decimal类型的,结果溢出了。
    看来你要找个大数运算的组件来支持高精度运算了。
    '改造失败的代码'
    Function SVtoTemp(V1 As Double) As Variant
        Dim d(9)        As Variant
        Dim i           As Integer
        Dim Temp        As Variant
        Dim lMax        As Long
        Dim V           As Variant    V = CDec(V1)
        If (V < -235) Or (V > 18694) Then Exit Function    Debug.Print "== " & V & "=="
        If V < 1874 Then
            lMax = 9
            d(0) = CDec(0)
            d(1) = CDec(0.18494946)
            d(2) = CDec(-0.0000800504062)
            d(3) = CDec(0.00000010223743)
            d(4) = CDec(-1.52248592E-10)
            d(5) = CDec(1.88821343E-13)
            d(6) = CDec(-1.59085941E-16)
            d(7) = CDec(8.2302788E-20)
            d(8) = CDec(-2.34181944E-23)
            d(9) = CDec(2.7978626E-27)
        ElseIf (V < 10332) Then
            lMax = 9
            d(0) = CDec(1.291507177)
            d(1) = CDec(0.1466298863)
            d(2) = CDec(-0.00001534713402)
            d(3) = CDec(3.145945973E-09)
            d(4) = CDec(-4.163257839E-13)
            d(5) = CDec(3.187863771E-17)
            d(6) = CDec(-1.2916375E-21)
            d(7) = CDec(2.183475087E-26)
            d(8) = CDec(-1.447379511E-31)
            d(9) = CDec(8.211272125E-36)
        ElseIf (V < 17536) Then
            lMax = 6
            d(0) = CDec(-8.087801117)
            d(1) = CDec(0.1621573104)
            d(2) = CDec(-0.000008536869453)
            d(3) = CDec(4.719686976E-10)
            d(4) = CDec(-1.441693666E-14)
            d(5) = CDec(2.08161889E-19)
            d(6) = CDec(0)
        Else
            lMax = 5
            d(0) = CDec(53338.75126)
            d(1) = CDec(-1.235892298)
            d(2) = CDec(0.001092657613)
            d(3) = CDec(-4.265693686E-08)
            d(4) = CDec(6.24720542E-13)
            d(5) = CDec(0)
        End If    Temp = CDec(0)
        For i = 0 To lMax
            Temp = Temp + d(i) * V ^ i
            Debug.Print i & ": " & Temp
        Next i    SVtoTemp = Temp
    End Function
      

  4.   

    Decimal 类型的“最小”值只到小数点后28位,
    那几个“乘负20几次方”的系数,你 CDec( ) 之后,已经直接引入较大误差了。
     还有-30多次方的,直接就“变成0”了。