java에서 "strictfp"키워드를 언제 사용해야합니까?


258

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

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


1
재현성이 필요한 것보다 실제로 성능이 더 필요한 경우가 아니면 항상
안티몬

1
@Antimony-또는 정확성 / 정확도. 예를 들어 x86 / x64는 내부에 80 비트 부동 소수점 레지스터를 사용하므로 엄격한 결과없이 긴 계산에 더 정확한 결과를 얻을 수 있습니다.
Robert Fraser

1
@Robert 실제로,이 사양은 가수의 정확도를 제한합니다. 유일한 차이점은 정규보다 큰 지수 정밀도를 사용할 수 있다는 것입니다. 이중 반올림으로 인해 드문 경우에는 차이가 있습니다.
안티몬

조인트 주위 에이 유용한 수정자를 뿌릴 수있는 옵션 외에도 새로운 sfloat & sdouble primitive strictfp 데이터 유형이 좋은 아이디어라고 생각합니다.
theRiley

답변:


274

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를 사용하면 결과가 정확하지 않고 이식 가능합니다.


28
재현 가능한 과학적 결과와 정확한 단위 테스트에 사용하십시오.
Aleksandr Dubinsky

1
" strictfp를 사용 하지 않으면 JVM 구현은 가능한 경우 추가 정밀도를 자유롭게 사용할 수 있습니다."-그 소리를 나쁜 것으로
만듭니다

@LinkTheProgrammer 그것은 확실히 나쁜 일이 될 있습니다
Tim

@TimCastelijns 나는 Happy Wheels 가 당신의 참고 라고 생각 합니까? 재생 기록 키 입력; FP-math 구현 정밀도 다양성으로 인해 유사한 하드웨어에서만 재생이 정확합니다. 부동 소수점 수학 변동성으로 인해보다 현실적인 문제의 이름을 지정할 수 있습니까? 입자 시뮬레이터를 상상할 수는 있지만 다른 것들은 무엇입니까?
AMDG

따라서 여러 플랫폼이 관련된 프로덕션 환경에서 항상 strictfp를 사용해야합니까?
beatrice

65

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

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

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


5
"중간 결과를 나타내는 확장 된 지수 범위"는 "부동 소수점 계산을 원하는대로 계산할 수있는 라이센스"가 아니며 실제로 strictfp계산조차도 도움이되지 않는 8087 FPU를 사용합니다. 그런 다음 약간의주의가 필요합니다. 참조 stackoverflow.com/questions/18496560/...
파스칼 Cuoq

@PascalCuoq re : "부동 소수점 계산을 원하는대로 계산할 수있는 라이센스"에 동의합니다 . 이 경우 strictfpIEEE 754 표준을 준수하므로 모든 플랫폼에서 동일한 결과를 얻을 수 있기 때문에이 경우에는 그 반대가 됩니다. 내가 볼 수있는 유일한 단점은 기본 하드웨어에서 실제로 좋은 FPU를 사용할 수 있다는 이점을 잃을 수 있다는 것입니다.
typeracer

25

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

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

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


8
strictfp는 Java 1.2에서 도입되었습니다. 이것은 오크가 디자인되었을 때보 다 훨씬 늦습니다.
Thorbjørn Ravn Andersen

"소수점 수는 부동 소수점이라고도 함"-10 진수는 밑 10을 의미하며 부동 소수점 표현과 관련이 없습니다.
aioobe

21

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

  • 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 값 집합을 독점적으로 사용하여 오버플로 또는 언더 플로가 발생할 수있는 상황에서 계산이 "정답"을 생성 할 수 있다는 것입니다.

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


12

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

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

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


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

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

  • 왜 사용 되는가? 판금

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

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

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


2

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

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

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

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


0

아래 예제가 이것을보다 명확하게 이해하는 데 도움이 될 수 있습니다. 자바에서 우리가 어떤 연산에 대해 정확한 정보를 찾고있을 때마다 예를 들어 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.

0

'strictfp'키워드는 Java에서 부동 소수점 계산의 정밀도 (float 또는 double)가 IEEE의 754 표준을 명시 적으로 준수하도록하는 데 사용됩니다. strictfp 키워드를 사용하지 않으면 부동 소수점 정밀도는 대상 플랫폼의 하드웨어에 따라 다릅니다.

인터페이스 또는 클래스가 strictfp로 선언 된 경우 해당 인터페이스 또는 클래스 내의 모든 메소드 및 중첩 유형은 내재적으로 strictfp입니다.

참조 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.