[java] java에서 “strictfp”키워드를 언제 사용해야합니까?

나는 이것이 무엇을했는지 찾아 보았지만 실제로 strictfpJava 에서 키워드를 사용할 때의 예가 있습니까? 실제로이 용도를 찾은 사람이 있습니까?

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



답변

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

JLS에서 :

FP-strict 표현식 내에서 모든 중간 값은 float 값 세트 또는 double 값 세트의 요소 여야합니다. 이는 모든 FP-strict 표현식의 결과가 단일 및 이중 형식을 사용하여 표현되는 피연산자에 대한 IEEE 754 산술에 의해 예측 된 결과 여야 함을 의미합니다. . FP가 엄격하지 않은 표현식 내에서 구현이 확장 된 지수 범위를 사용하여 중간 결과를 나타내는 일부 여유가 부여됩니다. 대략적으로 말하면, 순 효과는 float 값 집합 또는 double 값 집합을 독점적으로 사용하여 오버플로 또는 언더 플로가 발생할 수있는 상황에서 계산이 “정답”을 생성 할 수 있다는 것입니다.

다시 말해, Write-Once-Run-Anywhere가 실제로 Write-Once-Get-Equally-Wrong-Results-Everywhere를 의미 하는지 확인하는 것 입니다.

strictfp를 사용하면 결과가 정확하지 않고 이식 가능합니다.


답변

위키 백과 실제로이 주제에 대한 좋은 기사가 여기에 자바 스펙에 대한 링크를.

행 사이를 읽으면을 지정하지 않으면 strictfpJVM 및 JIT 컴파일러가 원하는 부동 소수점 계산을 계산할 수있는 라이센스 가 있다는 의미입니다 . 속도와 관련하여 계산을 프로세서에 위임 할 가능성이 높습니다. 로 strictfp에서의 계산은 IEEE 754 산술 표준을 준수해야하는, 실제로는, JVM이 계산을 다할 것을 아마 의미합니다.

그렇다면 왜 사용하고 싶 strictfp습니까? 내가 볼 수있는 한 가지 시나리오는 기본 하드웨어 또는 CPU에 관계없이 모든 부동 소수점 계산이 결정적이어야하는 분산 응용 프로그램 (또는 멀티 플레이어 게임)입니다. 트레이드 오프 란 무엇입니까? 실행 시간 일 가능성이 높습니다.


답변

그것은 모두 이야기로 시작되었습니다.

James Gosling, Herbert 및 나머지 팀이 Java를 개발할 때 그들은 플랫폼 독립성 이라는이 미친 것을 염두에 두었습니다 . 그들은 오크 (자바) 를 만들고 싶었다명령 세트가 다른 모든 컴퓨터에서 심지어 다른 운영 체제를 실행하는 경우에도 정확히 동일하게 실행됩니다. 그러나 프로그래밍 언어에서는 부동 소수점 및 더블이라고도하는 소수점 숫자에 문제가있었습니다. 일부 기계는 타겟팅 효율성을 높이고 나머지는 정확도를 타겟팅합니다. 따라서 후자 (보다 정확한) 머신의 부동 소수점 크기는 80 비트이고 전자 (더 효율적 / 빠른) 머신의 경우 64 비트 배가되었습니다. 그러나 이것은 플랫폼 독립적 언어를 구축하려는 핵심 아이디어에 위배되었습니다. 또한 코드가 일부 시스템 (64 비트 크기의 두 배)에 빌드되고 다른 종류의 시스템 (80 비트 크기의 두 배)에 실행될 때 정밀도 / 데이터가 손실 될 수 있습니다.

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


답변

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

  • strictfp 사용 (JDC 기술 팁)
  • jGuru : strictfp 수정자는 무엇입니까? 언제 사용해 볼까요?

    기본적으로 모든 것이 요약하면 코드에서 부동 소수점 식의 결과가 빠르거나 예측 가능한지 걱정하는지 여부입니다. 예를 들어, 여러 플랫폼에서 일관성을 유지하기 위해 부동 소수점 값을 사용하는 코드에 대한 답변이 필요한 경우을 사용하십시오 strictfp.

  • strictfp-Java 용어집

    부동 소수점 하드웨어는 Java 사양에 필요한 것보다 더 정밀하고 더 넓은 범위의 값으로 계산합니다. 일부 플랫폼이 다른 플랫폼보다 정밀도를 높인 경우 혼란 스러울 수 있습니다. strictfp메소드 또는 클래스 에서 수정자를 사용하면 컴파일러는 모든 플랫폼에서 동일한 결과를 얻기 위해 Java 스펙을 엄격하게 준수하는 코드를 생성합니다. 가 없으면 strictfp약간 느슨하지만 펜티엄의 가드 비트를 사용하여 80 비트의 정밀도를 제공하는 것은 아닙니다.

  • 그리고 마지막으로 실제 Java 언어 사양, §15.4 FP- 엄격한 표현 :

    FP-strict 표현식 내에서 모든 중간 값은 float 값 세트 또는 double 값 세트의 요소 여야합니다. 이는 모든 FP-strict 표현식의 결과가 단일 및 이중 형식을 사용하여 표현되는 피연산자에 대해 IEEE 754 산술에 의해 예측 된 결과 여야 함을 의미합니다. . FP-strict가 아닌 표현식 내에서 구현이 확장 된 지수 범위를 사용하여 중간 결과를 나타내는 일부 여유가 부여됩니다. 대략적으로 말하면, 순 효과는 float 값 집합 또는 double 값 집합을 독점적으로 사용하여 오버플로 또는 언더 플로가 발생할 수있는 상황에서 계산이 “정답”을 생성 할 수 있다는 것입니다.

그래도 개인적으로 사용한 적이 없습니다.


답변

다른 답변에서 언급했듯이 중간 부동 소수점 결과가 IEEE 사양을 준수합니다. 특히 x86 프로세서는 IEEE 사양과 다른 정밀도로 중간 결과를 저장할 수 있습니다. JIT가 특정 계산을 최적화하면 상황이 더 복잡해집니다. 매번 명령이 다를 수 있으므로 반올림이 약간 다릅니다.

strictfp에 의해 발생하는 오버 헤드는 프로세서 및 JIT에 따라 크게 다를 수 있습니다. SSE2 에 관한이 wikipedia 기사 는 문제에 대한 통찰력을 가지고있는 것 같습니다. 따라서 JIT가 계산을 수행하기 위해 SSE 명령어를 생성 할 수있는 경우 strictfp에 오버 헤드가없는 것 같습니다.

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


답변

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

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

  • 왜 사용 되는가? 판금

  • 또한 strictfp는 확장 된 정밀 부동 소수점 연산의 속도와 정밀도를 활용합니다.

  • 부동 소수점 계산을 수행 할 때 사용할 수있는이 키워드에는 단점이 없습니다

  • 마지막 포인트는 –IEEE754 란 무엇입니까 IEEE 754는 부동 소수점 계산과 부동 소수점 값을 단일 (32 비트, Java 부동 소수점에 사용) 또는 이중 (64 비트, Java에 사용)으로 저장하는 표준 방법을 정의합니다. 또한 중간 계산 및 확장 된 정밀 형식에 대한 표준을 정의합니다.


답변

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

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

클래스를로 선언하지 않으면 메소드를로 선언하여 메소드별로 동작을 strictfp얻을 수 있습니다 .strictfpstrictfp

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