printing the integral part of a floating point number

后端 未结 7 542
不知归路
不知归路 2021-01-13 23:03

I am trying to figure out how to print floating point numbers without using library functions. Printing the decimal part of a floating point number turned out to be quite ea

7条回答
  •  孤独总比滥情好
    2021-01-13 23:48

    /Edit: Read Unni's answer first. This results come from http://codepad.org/TLqQzLO3.

    void print_integral_part(float value)
    {
        printf("input : %f\n", value);
        char a[129]; // worst case is 128 digits for base 2 plus NUL
        char * p = a + 128;
        *p = 0;
        do
        {
            int digit = fmod(value, base);
            value /= base;
            printf("interm: %f\n", value);
            *--p = hex[digit];
        } while (value >= 1);
        printf("result: %s\n", p);
    }
    
    print_integral_part(3.40282347e+38F);
    

    to see how messed up your value gets by the value /= base operation:

    input : 340282346638528859811704183484516925440.000000
    interm: 34028234663852885981170418348451692544.000000
    interm: 3402823466385288480057879763104038912.000000
    interm: 340282359315034876851393457419190272.000000
    interm: 34028234346940236846450271659753472.000000
    interm: 3402823335658820218996583884128256.000000
    interm: 340282327376181848531187106054144.000000
    interm: 34028232737618183051678859657216.000000
    interm: 3402823225404785588136713388032.000000
    interm: 340282334629736780292710989824.000000
    interm: 34028231951816403862828351488.000000
    interm: 3402823242405304929106264064.000000
    interm: 340282336046446683592065024.000000
    interm: 34028232866774907300610048.000000
    interm: 3402823378911210969759744.000000
    interm: 340282332126513595416576.000000
    interm: 34028233212651357863936.000000
    interm: 3402823276229139890176.000000
    interm: 340282333252413489152.000000
    interm: 34028234732616232960.000000
    interm: 3402823561222553600.000000
    interm: 340282356122255360.000000
    interm: 34028235612225536.000000
    interm: 3402823561222553.500000
    interm: 340282366859673.625000
    interm: 34028237357056.000000
    interm: 3402823735705.600098
    interm: 340282363084.799988
    interm: 34028237619.200001
    interm: 3402823680.000000
    interm: 340282368.000000
    interm: 34028236.800000
    interm: 3402823.600000
    interm: 340282.350000
    interm: 34028.234375
    interm: 3402.823438
    interm: 340.282349
    interm: 34.028235
    interm: 3.402824
    interm: 0.340282
    result: 340282368002860660002286082464244022240
    

    When in doubt, throw more printfs at it ;)

提交回复
热议问题