2013-10-25 2 views
0

Michael Meadows EDIT 2과 동등하지만, VB.NET에서 시도한 결과가 다릅니다. (특히 DoubleDecimal 결과 모두 600000.0238418580이었다.)단일 상수를 런타임과 동일하게 얻으십시오.

I의 차이는 컴파일 시간 A를 Single에 저장된 Single 분할 정밀도 때 런타임에 발생하는 분열을 강제 함께 결정했다.

const ONE_MILLION As Integer = 1000000 

Dim THREEsng As Single = 3! 
Dim FIVEsng As Single = 5! 
Dim vTHREE_FIFTHS As Single = THREEsng/FIVEsng 

const THREE_FIFTHS As Single = 3!/5! 

Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10")) 
Dim asSingle As Single = 0! 
Dim asDouble As Double = 0# 
Dim asDecimal As Decimal = [email protected] 

For i As Integer = 1 To ONE_MILLION 
    asSingle += CSng(THREE_FIFTHS) 
    asDouble += CDbl(THREE_FIFTHS) 
    asDecimal += CDec(THREE_FIFTHS) 
Next 
Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION) 
Console.WriteLine("Single: {0}", asSingle.ToString("F10")) 
Console.WriteLine("Double: {0}", asDouble.ToString("F10")) 
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10")) 

Console.WriteLine("vThree Fifths: {0}", vTHREE_FIFTHS.ToString("F10")) 
asSingle = 0! 
asDouble = 0# 
asDecimal = [email protected] 

For i As Integer = 1 To ONE_MILLION 
    asSingle += CSng(vTHREE_FIFTHS) 
    asDouble += CDbl(vTHREE_FIFTHS) 
    asDecimal += CDec(vTHREE_FIFTHS) 
Next 
Console.WriteLine("Six Hundred Thousand: {0:F10}", vTHREE_FIFTHS * ONE_MILLION) 
Console.WriteLine("Single: {0}", asSingle.ToString("F10")) 
Console.WriteLine("Double: {0}", asDouble.ToString("F10")) 
Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10")) 

을 강조 표시된 차이와 그 결과는 다음과 같습니다 :

세 다섯째 : 0.6000000000
육백 천 : 600000.0000000000

그래서, THREE_FIFTHSvTHREE_FIFTHSasDecimal 요약에 대해 서로 다른 결과를 제공 싱글 : 599093.4000000000
더블 : 600000 0.0238418580
진수 : 600000.0238418580
vThree 다섯째 : 0.6000000000
육백 천 : 600000.0000000000
싱글 : 599093.4000000000
더블 : 600000.0238418580
진수 : 600000.0000000000는

내 질문은 당신이 얻을 수있다 VB.NET은 런타임 결과와 동일한 Const Single 표현식을 얻으려고합니까? an answer to my similar question for C#에서 지적했듯이, 컴파일 타임 상수가 정말 일정하지으로 "그것을 할 수 없다"(즉, vTHREE_FIFTHS 같은 결과와 THREE_FIFTHS을 생산하고 있습니다.)

답변

0

그것은 대답 생겼하는 되나 사용의 각 맥락에서 재 해석됩니다 (C#과 다르게). 특히 CDec 컴파일 타임 캐스트는 런타임 결과와 다른 결과를 생성합니다.

Sub Main 
     const ONE_MILLION As Integer = 1000000 

     Dim THREEsng As Single = 3! 
     Dim FIVEsng As Single = 5! 
     Dim vTHREE_FIFTHS As Single = THREEsng/FIVEsng 

     const THREE_FIFTHS As Single = 3!/5! 

     Console.WriteLine("Three Fifths: {0}", THREE_FIFTHS.ToString("F10")) 
     Console.WriteLine(GetByteString(THREE_FIFTHS)) 
     Dim asSingle As Single = 0! 
     Dim asDouble As Double = 0# 
     Dim asDecimal As Decimal = [email protected] 

     For i As Integer = 1 To ONE_MILLION 
      asSingle += CSng(THREE_FIFTHS) 
      asDouble += CDbl(THREE_FIFTHS) 
      asDecimal += CDec(THREE_FIFTHS) 
     Next 
     Console.WriteLine("Six Hundred Thousand: {0:F10}", THREE_FIFTHS * ONE_MILLION) 
     Console.WriteLine("Single: {0}", asSingle.ToString("F10")) 
     Console.WriteLine("Double: {0}", asDouble.ToString("F10")) 
     Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10")) 
     Console.WriteLine(GetByteString(CSng(THREE_FIFTHS))) 
     Console.WriteLine(GetByteString(CDbl(THREE_FIFTHS))) 
     Console.WriteLine(GetByteString(CDec(THREE_FIFTHS))) 

     Console.WriteLine("vThree Fifths: {0}", vTHREE_FIFTHS.ToString("F10")) 
     Console.WriteLine(GetByteString(vTHREE_FIFTHS)) 
     asSingle = 0! 
     asDouble = 0# 
     asDecimal = [email protected] 

     For i As Integer = 1 To ONE_MILLION 
      asSingle += CSng(vTHREE_FIFTHS) 
      asDouble += CDbl(vTHREE_FIFTHS) 
      asDecimal += CDec(vTHREE_FIFTHS) 
     Next 
     Console.WriteLine("Six Hundred Thousand: {0:F10}", vTHREE_FIFTHS * ONE_MILLION) 
     Console.WriteLine("Single: {0}", asSingle.ToString("F10")) 
     Console.WriteLine("Double: {0}", asDouble.ToString("F10")) 
     Console.WriteLine("Decimal: {0}", asDecimal.ToString("F10")) 
     Console.WriteLine(GetByteString(CSng(vTHREE_FIFTHS))) 
     Console.WriteLine(GetByteString(CDbl(vTHREE_FIFTHS))) 
     Console.WriteLine(GetByteString(CDec(vTHREE_FIFTHS))) 

End Sub 

' Define other methods and classes here 
Function GetByteString(d As Double) As String 

    return "#" & string.Join("", BitConverter.GetBytes(d) _ 
      .Select(Function (b)b.ToString("X2"))) 

End Function 

Function GetByteString(d As Decimal) As String 

    return "D" & string.Join("", Decimal.GetBits(d) _ 
      .Select(Function (b)b.ToString("X8"))) 

End Function 

Function GetByteString(f As Single) As String 

    return "S" & string.Join("", BitConverter.GetBytes(f) _ 
      .Select(Function (b)b.ToString("X2"))) 

End Function 

출력 :

세 다섯째 : 0.6000000000
S9A99193F
육백 천 : 단일 600000.0000000000
: 599093.4000000000
더블 : 600000.0238418580
진수 : 600000.0238418580
S9A99193F
# 00 0000403333E33F
D64494C42000221B200000000000F0000
vThree 다섯째 : 0.6000000000
S9A99193F
육백 천 : 600000.0000000000
싱글 : 599093.4000000000
더블 : 600000.0238418580
진수 : 600000.0000000000
S9A99193F
# 000000403333E33F
D00000006000000000000000000010000

관련 문제