문제

나는 이것이 무엇을 하는지 찾아보았지만 실제로 언제 사용할지에 대한 예를 가진 사람이 있습니까? strictfp 자바의 키워드?실제로 이것의 용도를 찾은 사람이 있습니까?

모든 부동 소수점 연산에 이를 적용하면 부작용이 있습니까?

도움이 되었습니까?

해결책

StrictFP는 모든 플랫폼에서 부동 소수점 계산에서 정확히 동일한 결과를 얻을 수 있도록합니다. StrictFP를 사용하지 않으면 JVM 구현은 사용 가능한 경우 추가 정밀도를 자유롭게 사용할 수 있습니다.

JLS에서:

FP-Strict 표현식 내에서, 모든 중간 값은 플로트 값 세트의 요소 또는 이중 값 세트 여야하며, 이는 모든 FP-Strict 표현식의 결과가 IEEE 754 단일 및 이중 형식을 사용하여 표현 된 IEEE 754 산술로 예측 된 결과임을 암시합니다. . FP 주류가 아닌 표현 내에서, 중간 결과를 나타내는 확장 지수 범위를 사용하기 위해 구현에 일부 여유가 부여됩니다. 대략적으로 말하자면, 계산은 플로트 값 세트 또는 이중 값 세트를 독점적으로 사용하면 오버 플로우 또는 언더 플로우를 초래할 수있는 상황에서 "정당"을 생성 할 수 있다는 것입니다.

다시 말해, 그것은 Write-once-run- 어디에서 실제로 의미합니다 Write-once-Get-Equally-Wrongertsults-Every에서.

strictfp를 사용하면 결과가 휴대용이 가능하지만 정확하지 않으면 정확할 가능성이 높습니다.

다른 팁

Wikipedia는 실제로이 주제에 대한 좋은 기사를 가지고 있습니다 여기, Java 사양에 대한 링크와 함께.

줄 사이를 읽고, 의미는 지정하지 않는 경우 strictfp, 그런 다음 JVM 및 JIT 컴파일러에는 플로팅 포인트 계산을 계산할 수있는 라이센스가 있습니다. 속도를 높이기 위해, 그들은 계산을 프로세서에 위임 할 가능성이 높습니다. 와 함께 strictfp ON에서, 계산은 IEEE 754 산술 표준을 준수해야하며, 실제로는 아마도 JVM이 계산을 수행한다는 것을 의미 할 것이다.

그래서 왜 당신은 사용하고 싶습니까? strictfp? 내가 볼 수있는 한 가지 시나리오는 배포 된 응용 프로그램 (또는 멀티 플레이어 게임)에서 모든 부동 소수점 계산이 기본 하드웨어 또는 CPU가 무엇이든 상관없이 결정적이어야합니다. 트레이드 오프는 무엇입니까? 아마도 실행 시간.

모두 이야기로 시작했습니다.

Java가 James Gosling에 의해 개발되었을 때 Herbert와 나머지 팀의 팀. 그들은이 미친 것을 염두에 두었습니다 플랫폼 독립성. 그들은 만들고 싶었습니다 오크 (Java) 다른 명령어 세트가있는 기계에서 정확히 동일하게 작동하는 것이 훨씬 낫습니다. 그러나 플로팅 포인트라고도하는 소수점 번호와 프로그래밍 언어에서는 두 배의 문제가있었습니다. 일부 기계는 타겟팅 효율성을 구축 한 반면 REST는 정확도를 목표로 삼았습니다. 따라서 나중에 (더 정확한) 기계는 50 비트의 부동 소수점 크기를 가졌으며, 이전 (보다 효율적/빠른) 기계는 64 비트 더블을 가졌습니다. 그러나 이것은 플랫폼 독립 언어를 구축하는 핵심 아이디어에 반대했습니다. 또한 일부 기계에 코드가 구축 될 때 (64 비트 크기의 두 배) 코드를 구축하고 다른 종류의 기계에서 실행될 때 정밀/데이터가 손실 될 수 있습니다 (80 비트 크기의 두 배).

업 사이징은 허용 될 수 있지만 다운 사이징은 할 수 없습니다. 그래서 그들은 strictfp의 개념을 발견했습니다. 엄격한 부동 소수점. 이 키워드를 클래스/기능과 함께 사용하는 경우 부동 소수점과 복식은 모든 컴퓨터보다 일관된 크기를 갖습니다. 즉, 각각 32/64- 비트.

다음은 몇 가지 참조입니다.

  • strictfp 사용 (JDC 기술 팁)
  • jguru : strictfp 수정자는 무엇입니까? 언제 사용하는 것을 고려할 것입니까?

    기본적으로, 모든 것이 요약되는 것은 코드의 부동 소수점 표현의 결과가 빠르거나 예측 가능하다는 것을 신경 쓰는지 여부입니다. 예를 들어, 부동 소수점 값을 사용하여 여러 플랫폼에서 일관되게하는 코드가 제공하는 답이 필요한 경우 strictfp.

  • strictfp -Java 용어집

    플로팅 포인트 하드웨어는 더 정밀하게 계산되며 Java 사양이 요구하는 것보다 더 넓은 값으로 계산됩니다. 일부 플랫폼이 다른 플랫폼보다 더 정밀도를 주면 혼란 스러울 것입니다. 당신이 사용할 때 strictfp 메소드 또는 클래스의 수정자는 컴파일러가 모든 플랫폼에서 동일한 결과를 위해 Java 사양에 엄격하게 준수하는 코드를 생성합니다. 없이 strictfp, 그것은 약간 느슨하지만, 펜티엄의 가드 비트를 사용하여 80 비트의 정밀도를 제공하는 것만 큼 느슨하지는 않습니다.

  • 그리고 마지막으로 실제 Java 언어 사양, §15.4 FP 주류 표현:

    FP-Strict 표현식 내에서, 모든 중간 값은 플로트 값 세트의 요소 또는 이중 값 세트 여야하며, 이는 모든 FP-Strict 표현식의 결과가 IEEE 754 단일 및 이중 형식을 사용하여 표현 된 IEEE 754 산술로 예측 된 결과임을 암시합니다. . FP 주류가 아닌 표현 내에서, 중간 결과를 나타내는 확장 지수 범위를 사용하기 위해 구현에 일부 여유가 부여됩니다. 대략적으로 말하자면, 계산은 플로트 값 세트 또는 이중 값 세트를 독점적으로 사용하면 오버 플로우 또는 언더 플로우를 초래할 수있는 상황에서 "정당"을 생성 할 수 있다는 것입니다.

나는 개인적으로 그것을 사용하지 않았다.

다른 답변에서 언급 한 바와 같이, 중간 부동물 포인트 결과는 IEEE 사양을 준수하게됩니다. 특히 X86 프로세서는 IEEE 사양과 다른 정밀도로 중간 결과를 저장할 수 있습니다. JIT가 특정 계산을 최적화 할 때 상황이 더욱 복잡해집니다. 순서는 지침이 매번 다를 수있어 약간 다른 반올림이 발생할 수 있습니다.

strictfp에 의해 발생 된 오버 헤드는 프로세서 및 JIT 의존적 일 가능성이 높습니다. 이 위키 백과 기사 SSE2 문제에 대한 통찰력이있는 것 같습니다. 따라서 JIT가 계산을 수행하기 위해 SSE 지침을 생성 할 수 있다면 StrictFP에는 오버 헤드가없는 것 같습니다.

내 현재 프로젝트에는 strictfp를 사용하는 곳이 몇 개 있습니다. 픽셀 값에서 잠재적 인 우주 광선을 제거 해야하는 지점이 있습니다. 일부 외부 연구원이 동일한 픽셀 값과 우주 광선을 가지고 있다면 소프트웨어와 동일한 값을 얻어야합니다.

  • strictfp는 IEEE 754에 따라 부동 소수점 계산을 제한하는 수정 자입니다.

  • 이것은 "public strictfp class strictfmodifierexample {}"또는 "public strictfp void example ()"과 같은 전체 클래스에서 사용할 수 있습니다. 모든 방법보다 클래스에서 사용되는 경우 IEEE 754를 따르고 메소드에 사용되는 경우 특정 메소드가됩니다. IEEE 754를 따르십시오.

  • 사용되는 이유? ::: 다른 플랫폼이 다르기 때문에 부동 소수점 하드웨어가 있기 때문에 Java 사양보다 더 정밀하고 값 범위의 값을 계산하여 다른 플레이트 폼에서 차이 출력을 생성 할 수 있습니다. 플레이트 폼

  • StrictFP는 또한 확장 정밀 부동 소수점 작업의 속도와 정밀도를 활용합니다.

  • 플로팅 포인트 계산을 할 때 사용할 수있는이 키워드에는 단점이 없습니다.

  • 마지막 요점은 -IEEE754의 요점은 IEEE 754의 IEEE754는 부동 소수점 계산 및 부동 소수점 값의 표준 방법을 정의합니다 (Java Floats에서 사용되는 32 비트 (32 비트) 또는 Double (64 비트, Java에서 사용됩니다. 복식) 정밀도. 중간 계산 및 확장 정밀 형식의 규범도 정의합니다.

strictfp 키워드이며 클래스나 메서드에 대한 비액세스 한정자로 사용할 수 있습니다(변수는 아님).클래스를 다음으로 표시 strictfp 이는 클래스의 모든 메소드 코드가 부동 소수점에 대한 IEEE 754 표준 규칙을 준수함을 의미합니다.

해당 수정자가 없으면 메서드에 사용되는 부동 소수점은 플랫폼에 따라 동작할 수 있습니다.이를 통해 JVM이 실행 중인 기본 플랫폼에 관계없이 부동 소수점이 어떻게 작동할지 예측할 수 있습니다.단점은 기본 플랫폼이 더 높은 정밀도를 지원할 수 있다면 strictfp 메서드에서는 이를 활용할 수 없습니다.

클래스를 다음과 같이 선언하지 않으면 strictfp, 여전히 얻을 수 있습니다 strictfp 메소드를 다음과 같이 선언하여 메소드별로 동작을 수행합니다. strictfp.

~ Java™ 6용 SCJP Sun® 인증 프로그래머 - Kathy Sierra 및 Bert Bates ~

아래의 예제는 이것을 더 명확하게 이해하는 데 도움이 될 수 있습니다. Java에서 우리가 모든 작업에 대한 정확한 정보를 찾을 때마다 예를 들어 Double Num1 = 10e+102를 수행하는 경우; 이중 Num2 = 8e+10; 결과 = num1+ num2;

        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top