C library function -frexp()

C standard library - <math.h>

Description

C Library Functionsdouble frexp(double x, int *exponent)Decompose floating-point number x into a mantissa and an exponent. The return value is the mantissa, and the exponent is stored intoexponentIn. The resulting value isx = mantissa * 2 ^ exponent。

frexp()is the C standard library<math.h>a function that decomposes a floating-point number into a significand and a base-2 exponent. It is commonly used for advanced operations on floating-point numbers, such as normalization and numerical analysis.

Declaration

Below is the declaration of the frexp() function.

#include <math.h>

double frexp(double x, int *exp);
float frexpf(float x, int *exp);
long double frexpl(long double x, int *exp);

Parameter

  • xThe floating-point number to be decomposed.
  • exp: pointer to an integer, used to store the base-2 exponent.

Return Value

  • returnxThe significand part of, such thatx = mantissa * 2^exp, wheremantissaThe return value is in the valid range of 0.5 (inclusive) to 1.0 (exclusive), or -0.5 (inclusive) to -1.0 (exclusive),expis the exponent.

Example

The following example demonstrates the usage of the frexp() function.

Example

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

int main ()
{
   double x = 1024, fraction;
   int e;
   
   fraction = frexp(x, &e);
   printf("x = %.2lf = %.2lf * 2^%d\n", x, fraction, e);
   
   return(0);
}

Let us compile and run the above program, which will produce the following result:

x = 1024.00 = 0.50 * 2^11

process multiple floating-point numbers

The following example shows how to handle multiple floating-point numbers:

Example

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

int main() {
    double values[] = {0.5, 1.0, 4.0, 10.0, 16.0};
    int num_values = sizeof(values) / sizeof(values[0]);

    for (int i = 0; i < num_values; i++) {
        double x = values[i];
        int exponent;
        double mantissa = frexp(x, &exponent);
        printf("x = %f, mantissa = %f, exponent = %d\n", x, mantissa, exponent);
    }

    return 0;
}

Let us compile and run the above program, which will produce the following result:

x = 0.500000, mantissa = 0.500000, exponent = 0
x = 1.000000, mantissa = 0.500000, exponent = 1
x = 4.000000, mantissa = 0.500000, exponent = 3
x = 10.000000, mantissa = 0.625000, exponent = 4
x = 16.000000, mantissa = 0.500000, exponent = 5

Code explanation

  • Define an array containing multiple floating-point numbersvalues。
  • UsageforLoop through each value and callfrexp()perform decomposition and print the results.

Usagefrexp()Practical application

frexp()It is commonly used in the standardized representation of floating-point numbers and various algorithms in numerical analysis. It can help avoid overflow and underflow issues that occur when directly manipulating floating-point numbers.

The following example demonstrates how to usefrexp()andldexp()(withfrexp()related functions) to decompose and reconstruct floating-point numbers:

Example

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

int main() {
    double x = 123.456;
    int exponent;
    double mantissa = frexp(x, &exponent);

    // Reconstruct the floating-point number
    double reconstructed_x = ldexp(mantissa, exponent);

    printf("Original x = %f\n", x);
    printf("Mantissa = %f, Exponent = %d\n", mantissa, exponent);
    printf("Reconstructed x = %f\n", reconstructed_x);

    return 0;
}

Let us compile and run the above program, which will produce the following result:

Original x = 123.456000
Mantissa = 0.964500, Exponent = 7
Reconstructed x = 123.456000

Code explanation

  • define a floating-point numberx, the value is 123.456.
  • Usagefrexp()willxDecompose into significand and exponent.
  • Usageldexp()Reconstruct the original floating-point number from the significand and exponent.
  • Print the original value, significand, exponent, and the reconstructed floating-point number.

Summary

frexp()The function is used to decompose floating-point numbers into significands and exponents, and is an important tool for handling floating-point operations. Through reasonable use,frexp()efficient operations on floating-point numbers can be achieved in numerical analysis, scientific computing, and engineering applications.

C standard library - <math.h>

other extensions