문제

왜 이것이 왜 이것이 어떻게 일어나는지 설명 할 수 있습니까?

static void Main()
{
    const float xScaleStart = 0.5f;
    const float xScaleStop = 4.0f;
    const float xScaleInterval = 0.1f;
    const float xScaleAmplitude = xScaleStop - xScaleStart;

    const float xScaleSizeC = xScaleAmplitude / xScaleInterval;

    float xScaleSize = xScaleAmplitude / xScaleInterval;

    Console.WriteLine(">const float {0}, (int){1}", xScaleSizeC, (int)xScaleSizeC);

    Console.WriteLine(">      float {0}, (int){1}", xScaleSize, (int)xScaleSize);

    Console.ReadLine();
}
.

출력 :

>const float 35, (int)34
>      float 35, (int)35
.

0.1의 바이너리 표현은 실제로 0.09999990463256835937이지만 'float'가 아닌 'und float'를 사용하는 이유는 무엇입니까?이것은 컴파일러 버그로 간주됩니까?

레코드의 경우 코드는 다음과 같이 컴파일합니다.

private static void Main(string[] args)
{
    float xScaleSize = 35f;
    Console.WriteLine(">const float {0}, (int){1}", 35f, 34);
    Console.WriteLine(">      float {0}, (int){1}", xScaleSize, (int)xScaleSize);
    Console.ReadLine();
}
.

도움이 되었습니까?

해결책

왜 "왜"float 데이터로 작업 할 때, float 또는 double에 대해 지정된 것보다 정밀도가 더 높은 내부 표현을 자주 발생하는 사실로 기본적으로 끓일 수 있습니다. 이것은 가상 실행 시스템 (VES) SPEC ( Partition i ) :

부동 소수점 숫자는 내부 부동 소수점을 사용하여 표시됩니다. 유형. 각각의 이러한 경우, 변수 또는 표현식의 공칭 유형은 float32 또는 float64이지만 값은 추가 범위 및 / 또는 정밀도가있는 내부적으로 대표 할 수 있습니다

및 나중에 우리는 다음과 같습니다 :

float32 또는 generacodicicetagcode보다 넓은 내부 표현을 사용하면 차이가 발생할 수 있습니다. 개발자가 코드에 대한 비 관련없는 수정을 수행하면 전산 결과 결과 이는 내부 표현 (예를 들어, 레지스터에서)에서 값이 내부 표현 (예를 들어, 레지스터에서)으로부터 쏟을 수 있습니다. 스택.

이제, C # 언어 사양 :

일정한 표현식의 컴파일 타임 평가는 런타임 평가가 예외를 던 졌을 때, 컴파일 타임 평가가 컴파일 타임에 오류를 일으키는 경우를 제외하고는 비 상수 표현식의 런타임 평가와 동일한 규칙을 사용합니다. 발생합니다.

위에서 관찰 할 때, 규칙은 실제로 시동에 더 정밀하게 사용 되며이 향상된 정밀도가 사용되는 경우 실제로 직접 제어하에 있습니다.


그리고 분명히, 다른 상황에서는, 당신이 관찰 한 것과 정확하게 그 결과가 정확하게 지적 될 수 있었고, 컴파일러는 정밀도를 낮추고 런타임이 더 높은 정밀도를 유지할 수 있었다.

다른 팁

나는 이것이 중복 된 질문이라고 말할 수 없다 -> Eric Postpischil 댓글

은 Int와 Const Int와 관련하여 매우 유사한 것을 설명했습니다.

주요 아이디어는 런타임에 코드를 생성하지 않고 컴파일러가 아닌이 특정 경우에 컴파일러에서 계산 한 두 개의 상수의 분할이 double 형식.따라서 XScalesizec은 기본적으로 34.9999 ... run-time to int에서 34가됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top