programing

플로트와 더블의 차이점은 무엇입니까?

prostudy 2022. 6. 2. 21:30
반응형

플로트와 더블의 차이점은 무엇입니까?

2배 정밀도와 1배 정밀도의 차이에 대해 읽은 적이 있습니다. 「」는, 「 」입니다.float ★★★★★★★★★★★★★★★★★」double것 .★★★★★★★★★★★★★★★★★?플로트와 더블은 언제 교환이 가능합니까?들의의 ?? ?? ?? ??? ??

엄청난 차이.

이름에서 알 수 있듯이 a의 정밀도는 의 2배입니다.일반적으로 a는double에는 소수점 이하가 15자리입니다.float17이 .

자릿수는 다음과 같이 계산됩니다.

double에는 52개의 가수 비트와 1개의 숨겨진 비트가 있습니다.log (253) subsclog(10) = 15.95자리 숫자

float에는 23개의 가수 비트와 1개의 숨겨진 비트가 있습니다.log (224) subsclog(10) = 7.22자리 숫자

이러한 정밀도 손실은 반복 계산을 수행할 때 더 큰 잘라내기 오류가 누적될 수 있습니다.

float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.7g\n", b); // prints 9.000023

하는 동안에

double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
    b += a;
printf("%.15g\n", b); // prints 8.99999999999996

약 한한 also also also also also 。3e38, 은 약 2배입니다1.7e308 , , , , , , , , , , , , , , , , , , , ,,float보다 훨씬 더 쉽게 '점수'(즉, 특별한 부동소수점수)를 칠 수 있다.double예를 들어, 60의 계수를 계산하는 것과 같은 간단한 것을 위해.

테스트 중에 몇 개의 테스트 케이스에 이러한 숫자가 포함되어 있을 수 있습니다.이 경우, 플로트를 사용하면 프로그램이 실패할 수 있습니다.


물론 가끔은 심지어double.long double[1] (위의 예에서는 Mac에서는 9.0000000000000066이 표시되지만 모든 부동소수점 유형은 반올림 오류가 발생하므로 정밀도가 매우 중요한 경우(예: 금전 처리)를 사용해야 합니다.int또는 소수 클래스입니다.


한한사 further further further further further further further further further further 。+=오차가 빠르게 누적되기 때문에 부동 소수점 숫자를 합산할 수 있습니다.Python을 Python을 합니다.fsum그렇지 않으면 Kahan summary 알고리즘을 구현해 보십시오.


[C및 C은 [1]의 1] : C 및 C + + 표 、 C + + 음 、 음음 음음 、 음음 음음 음음 [ 。float,double ★★★★★★★★★★★★★★★★★」long doubleIEEE 2는 IEEE 2는 IEEE 2는 IEEE 2는 IEEE 2가 됩니다. 대부분의 에서는 (gcc, MSVC, x86, x64, ARM)가 사용됩니다.float 실제로는 IEEE 단정도 부동소수점 번호(binary32)입니다.double 는 IEEE 배정도 부동소수점 번호(바이너리64)입니다.

부동소수점 유형에는 다음 세 가지가 있습니다.

  • 흘러가다
  • 이중으로 하다
  • 롱 더블

간단한 Venn 다이어그램은 다음을 설명합니다.유형의 값 집합

여기에 이미지 설명 입력

표준 C99(ISO-IEC 9899 6.2.5 1010) 또는 C++2003(ISO-IEC 14882-2003 3.1.9 88) 규격에서는 다음과 같이 기술되어 있습니다.

유형은 세 .float,double , , , , 입니다.long double입 . 。double적어도 같은 정도의 정밀도를 제공하다float및 「」는, " 입니다.long double적어도 같은 정도의 정밀도를 제공하다double의 값 입니다.float는, 의 값 .double; 의 값 「」 「」double는, 의 값 .long double.

C++ 규격에는 다음이 추가되어 있습니다.

부동소수점 유형의 값 표현은 구현 정의됩니다.

IEEE 부동소수점 표준을 상세하게 다루고 있는 뛰어난 What Every Computer Scientist Should Know About Float Point 산술에 대해 살펴보는 것이 좋습니다.표현에 대한 세부사항을 학습하고 규모와 정밀도 사이에 균형이 있다는 것을 알게 될 것입니다.부동소수점 표현의 정밀도는 크기가 감소함에 따라 증가하므로 -1과 1 사이의 부동소수점 숫자가 가장 정밀합니다.

방금 오류가 발생하여 알아내는 데 시간이 오래 걸렸고 플로트 정밀도의 좋은 예를 제공할 수 있습니다.

#include <iostream>
#include <iomanip>

int main(){
  for(float t=0;t<1;t+=0.01){
     std::cout << std::fixed << std::setprecision(6) << t << std::endl;
  }
}

출력은

0.000000
0.010000
0.020000
0.030000
0.040000
0.050000
0.060000
0.070000
0.080000
0.090000
0.100000
0.110000
0.120000
0.130000
0.140000
0.150000
0.160000
0.170000
0.180000
0.190000
0.200000
0.210000
0.220000
0.230000
0.240000
0.250000
0.260000
0.270000
0.280000
0.290000
0.300000
0.310000
0.320000
0.330000
0.340000
0.350000
0.360000
0.370000
0.380000
0.390000
0.400000
0.410000
0.420000
0.430000
0.440000
0.450000
0.460000
0.470000
0.480000
0.490000
0.500000
0.510000
0.520000
0.530000
0.540000
0.550000
0.560000
0.570000
0.580000
0.590000
0.600000
0.610000
0.620000
0.630000
0.640000
0.650000
0.660000
0.670000
0.680000
0.690000
0.700000
0.710000
0.720000
0.730000
0.740000
0.750000
0.760000
0.770000
0.780000
0.790000
0.800000
0.810000
0.820000
0.830000
0.839999
0.849999
0.859999
0.869999
0.879999
0.889999
0.899999
0.909999
0.919999
0.929999
0.939999
0.949999
0.959999
0.969999
0.979999
0.989999
0.999999

0.83 이후에서 볼 수 있듯이 정밀도는 상당히 떨어집니다.

을 는, 「」를 설정합니다.t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

이 사소한 오류를 깨닫는 데 5시간이 걸려서 프로그램이 엉망이 되었다.

2차 방정식 x2 - 4.0000000 x + 3.999999 = 0일 때 10개의 유효 자릿수에 대한 정확1 루트는 r = 2.000316228 및 r2 = 1.999683772입니다.

「」를 사용합니다.float ★★★★★★★★★★★★★★★★★」double이치노

#include <stdio.h>
#include <math.h>

void dbl_solve(double a, double b, double c)
{
    double d = b*b - 4.0*a*c;
    double sd = sqrt(d);
    double r1 = (-b + sd) / (2.0*a);
    double r2 = (-b - sd) / (2.0*a);
    printf("%.5f\t%.5f\n", r1, r2);
}

void flt_solve(float a, float b, float c)
{
    float d = b*b - 4.0f*a*c;
    float sd = sqrtf(d);
    float r1 = (-b + sd) / (2.0f*a);
    float r2 = (-b - sd) / (2.0f*a);
    printf("%.5f\t%.5f\n", r1, r2);
}   

int main(void)
{
    float fa = 1.0f;
    float fb = -4.0000000f;
    float fc = 3.9999999f;
    double da = 1.0;
    double db = -4.0000000;
    double dc = 3.9999999;
    flt_solve(fa, fb, fc);
    dbl_solve(da, db, dc);
    return 0;
}  

프로그램을 실행하면 다음과 같은 이점이 있습니다.

2.00000 2.00000
2.00032 1.99968

크지는 를 볼 수 점에 하세요.float.

(사실 위의 방법은 단정도 또는 배정도 부동소수점 숫자를 사용하여 2차 방정식을 푸는 가장 좋은 방법은 아니지만, 보다 안정적인 방법을 사용하더라도 답은 변하지 않습니다.)

32비트 길이의 Type float는 정밀도가 7자리입니다.매우 크거나 매우 작은 범위(+/-3.4 * 10^38 또는 * 10^-38)의 값을 저장할 수 있지만 유효 자릿수는 7자리뿐입니다.

Type double, 길이 64비트, 범위(*10^+/-308)가 크고 정밀도가 15자리입니다.

type long double은 명목상 80비트이지만, 특정 컴파일러/OS 페어링은 정렬을 위해 12-16바이트로 저장할 수 있습니다.긴 배수의 지수는 엄청나게 크고 19자리의 정밀도를 가지고 있습니다.마이크로소프트는 무한한 지혜로 긴 두 배를 8바이트로 제한하고 있으며, 이는 일반적인 두 배와 동일합니다.

일반적으로 부동소수점 값/변수가 필요한 경우 type double만 사용합니다.식에 사용되는 리터럴 부동소수점 값은 기본적으로 2배로 처리되며 부동소수점 값을 반환하는 대부분의 산술 함수는 2배를 반환합니다.더블만 사용하시면 많은 두통과 타이프 캐스팅을 줄일 수 있습니다.

플로트는 더블보다 정밀도가 떨어진다.이미 알고 있지만 부동소수점 산술에 대해 알아야 할 내용을 읽어보십시오.

부동 소수점 계산에 관련된 숫자의 크기는 가장 관련이 있는 것이 아닙니다.관련된 것은 현재 수행되고 있는 계산입니다.

기본적으로 계산을 수행 중 결과가 비이성수 또는 반복 소수인 경우 해당 숫자가 사용 중인 유한 크기 데이터 구조로 압축되면 반올림 오류가 발생합니다.더블은 플로트의 2배 크기이기 때문에 반올림 오차는 훨씬 작아집니다.

테스트에서는, 이러한 에러의 원인이 되는 번호를 사용하는 경우가 있기 때문에, 코드에 적절한 타입이 사용되고 있는 것을 테스트합니다.

  • 더블은 64, 싱글 정밀도(플로트)는 32비트입니다.
  • 배수는 더 큰 가수(실수의 정수 비트)를 가집니다.
  • 모든 오차는 두 배로 줄어들 것이다.

임베디드 프로세싱으로 작업하는 경우, 최종적으로 기반이 되는 하드웨어(FPGA 또는 일부 특정 프로세서/마이크로 컨트롤러 모델 등)는 하드웨어에 최적으로 구현되어 소프트웨어 루틴을 사용하게 됩니다.따라서 플로트의 정밀도가 요구를 충족하기에 충분하다면, 프로그램은 플로트를 사용하여 몇 배 더 빠르게 실행될 것입니다.다른 답변에서도 언급되었듯이 누적 오류에 주의하십시오.

두 숫자를 부동 소수점과 비교할 때 데이터 유형의 차이(예: 부동 또는 이중)로 인해 결과가 달라질 수 있으므로 내장된 비교 연산이 다릅니다.

부동소수점 번호를 사용하는 경우 로컬테스트가 서버 측에서 실행되는 테스트와 완전히 동일한지 여부를 신뢰할 수 없습니다.환경과 컴파일러는 로컬 시스템과 최종 테스트가 실행되는 장소에서 다를 수 있습니다.일부 TopCoder 경기에서는 특히 두 부동 소수점 숫자를 비교하려고 할 때 이 문제를 여러 번 목격했습니다.

★★★★★★★★★★★★★★★와 달리int), (전화번호), (전화번호 (전화번호)floatdouble하지만 그 둘의 차이점은double디테일이 두 배나 세밀합니다.float즉, 소수점 뒤의 두 배의 숫자를 가질 수 있습니다.

보면 처럼 '에 있다', '다음에', '다음에', '다음에', '다음에', '에', '다음에 있다'double의 정밀도는 약 약 은 2배, 타입은 3배입니다.float(비슷하게 하다)

하지만 아마도 더 중요한 것은 질적인 차이일 것이다.「」라고 입력합니다.float정확성이 뛰어나서 무엇을 하든 충분할 때가 많습니다.「」라고 입력합니다.double한편, 뛰어난 정밀도를 가지고 있기 때문에, 무엇을 하든 항상 충분합니다.

결과적으로 필요한 만큼 잘 알려져 있지 않지만, 거의 항상 type을 사용해야 합니다.특별한 필요가 없는 한, 활자를 사용하는 것은 거의 없습니다.float.

모두가 알고 있듯이 부동소수점 작업을 할 때 "반올림 오류"가 종종 문제가 됩니다.반올림 오류는 미묘하고 추적하기 어려우며 수정이 어려울 수 있습니다.대부분의 프로그래머는 부동소수점 알고리즘의 수치 오류를 추적하고 수정할 시간이나 전문지식이 없습니다.불행하게도 알고리즘마다 상세 내용이 다르기 때문입니다., 「」라고 합니다.double충분한 정밀도를 가지고 있기 때문에 대부분의 경우 걱정할 필요가 없습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★「」라고 합니다.float한편, 반올림 시 항상 우려할 만한 문제가 발생한다.

그리고 유형별로 항상 다른 것은 아니다.float ★★★★★★★★★★★★★★★★★」double실행 속도입니다.오늘날됩니다.float ★★★★★★★★★★★★★★★★★」double거의 같은 시간이 걸린다.것이에 더 큰.double것이 한 거의 것이 float 중 또는 를 쓰는 ( )를 합니다.★★★★★★★★★★★★★★★★★★★★★★★★★,double느리거나 않을 수 때문에 으로 타입을 합니다.float정확하게 지불할 수 있습니다.)

언급URL : https://stackoverflow.com/questions/2386772/what-is-the-difference-between-float-and-double

반응형