float는 4바이트를 차지하는데, 이는 32비트인 int와 동일합니다.
첫 번째 비트는 부호를 나타내고, 0은 양수, 1은 음수를 나타냅니다. 이는 이해하기 쉬우므로 걱정하지 마세요.
2~9번째 비트는 지수를 나타내며 총 8비트(0~255를 나타낼 수 있음)는 2를 기준으로 합니다. 양수와 음수를 모두 표현하려면 오프셋 127을 빼야 합니다. 이 경우 범위는 (-127~128)입니다. 또한, 모두 0과 모두 특수 처리로 처리되므로 -126~127까지 그대로 표현됩니다.
나머지 23비트는 소수 부분을 나타내며, 기본 선행 1이 있기 때문에 23비트는 24비트 숫자를 나타냅니다(이진수에만 이 기능이 있음).
최종 결과는 (-1)^(sign) * 1입니다. f * 2^(지수)
여기에서 sign은 부호 비트, f는 23비트의 소수 부분, exComponent는 지수 부분, 최종 범위는 다음과 같습니다(양수와 음수는 대칭이므로 여기서는 양수만 고려합니다).
2^(-126) ~~ 2(1-2^(-24)) * 2^127
이는 표준이 비정규화된 표현을 규정하고 몇 가지 특별한 규정이 있기 때문에 float의 값 범위가 아닙니다.
비정규화된 표현:
지수 부분이 모두 0이고 소수 부분이 모두 0이 아닌 경우 기본적으로 선행 1이 없고 0이 있으므로 비정규화된 부동 소수점 숫자를 나타냅니다.
값 비트는 0입니다. f * 2^(-126), 범위 비트 2^(-149)~~ (1-2^(-23)) * 2^(-126)을 나타냄 여기서 부호는 고려되지 않습니다. -127이 아닌 -126인 이유는 무엇입니까? -127이면 최대 표현은 다음과 같습니다.
2^(-127)-2^(-149), 당연히 2^(-127) ~~2^(-126)은 표현할 수 없습니다.
그 외 특수 표현
1. 지수 부분과 소수 부분이 모두 0인 경우 0 값을 나타내며 +0과 -0으로 나눌 수 있습니다(부호 비트로 결정). 0x00000000은 양수 0을 나타내고 0x80000000은 음수 0을 나타냅니다.
2. 지수 부분이 모두 1이고 소수 부분이 모두 0이면 양의 무한대와 음의 무한대를 포함하여 무한대를 의미합니다. 0x7f800000은 양의 무한대를 의미하고 0xff800000은 음의 무한대를 의미합니다.
3. 지수 부분이 모두 1이고 소수 부분이 모두 0이 아닌 경우 NaN을 의미하며, 이는 QNaN과 SNaN으로 구분됩니다. 둘 다 Java에서는 NaN입니다.
결론적으로:
부동 소수점 숫자의 값 범위는 2^(-149)~~(2-2^(-23))*2^127이며 이는 Float임을 알 수 있습니다. MIN_VALUE 및 부동. MAX_VALUE.
PS: 부동 소수점을 16진수로, 16진수를 부동 소수점으로
package com.sondon.dev_soceket.test; /** * @Project: 하드웨어 통신* @Package: com.sondon.tcpip * @Class: Test.java * @Company 광저우 Xundong 네트워크 기술 유한 회사* @Author: Cai Wenfeng* @DateTime: 2015년 4월 2일 오전 11:21:53 * @Blog: http://blog.csdn.net/caiwenfeng_for_23 * @Description: {Test} */ public class Test { public static void main(String[] args) { String s="3E1E9E9F"; Float. intBitsToFloat(Integer.valueOf(s.trim(), 16)); System.out.println(value); f=0.15490197f; System.out.println(Integer.toHexString(Float.floatToIntBits(f)));