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
'(-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
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
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
未完待续...
看来你要找个大数运算的组件来支持高精度运算了。
'改造失败的代码'
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
那几个“乘负20几次方”的系数,你 CDec( ) 之后,已经直接引入较大误差了。
还有-30多次方的,直接就“变成0”了。