回 帖 发 新 帖 刷新版面

主题:[讨论]对float的思考

探究float类型的数在内存中的表示方法,输出结果看了半天还是没看出什么规律来!!!希望高手帮我分析下,谢谢!!!
代码如下 :

[code=c]
#include "stdio.h"
#include "stdlib.h"

#define N  4 //sizeof(float)

typedef union float_char {
        float f      ;
        char  c[ N ] ;
        } float_char ;


void ( print_fc )( float_char fc )
     {
     char *p  = fc.c+N-1   ,
          *p0 = fc.c ;
     unsigned char  k  = 0x80   ;
     
     printf( "\n%10.6f ->   ",fc.f  ) ;
     while ( p>=p0 )
           {
           printf( "%c ",k&(*p) ? '1' : '0' );
           (k>>=1)<1 ? (printf( " " ),--p,k=0x80 ) : 0 ;
           }  
     }


void ( print )( float f, float step, int n )
     {
     float_char fc={.f=f};
     printf( "\n\n       fc.f=%8.6f  step= %8.6f  n= %d",
            fc.f,step,n );
     for ( ;--n>=0;fc.f+=step )
           print_fc( fc )     ;
     }


int main( void )
    {
    
    print( 0.0,  1.0, 10  ) ;  
    print( 0.0,  0.5, 10  ) ; 
    print( 0.0,  2.0, 10  ) ;  
    print( 0.0,-0.01, 10  ) ;
            
    printf( "\n\n"  ) ;
    system( "pause" ) ;
    return 0  ;
    }
[/code]

回复列表 (共10个回复)

沙发

直接在Google中搜索一下“浮点数 IEEE 754”就行了呀
符号位、带偏移的指数、可能还有隐含的1.0、尾数(有效数)

用十进制来说明一下,比如 -23.456,用科学计数法就是 -2.3456E10
需要一bit来指示正负号、需要几bits来指示指数值、剩下的用来保存2.3456
对于指数,因为可能有正有负,为了简便,用0来代表-n,用n来代表0,用2n来代表n,也就是全是正数,只要减去一个偏移值n就是实际的指数
对于尾数,因为实际用的是二进制,所以开头必定是“1.”,那么这个“1.”就是多余的,可以省略掉它而用来保存更多的尾数。当然不是所有浮点格式都会舍弃掉它,80bits临时实数就没舍弃它。
float和double的不同仅仅在于:用多少bits来存指数,用多少bits来存尾数

板凳

[quote]用十进制来说明一下,比如 -23.456,用科学计数法就是 -2.3456E10
需要一bit来指示正负号、需要几bits来指示指数值、剩下的用来保存2.3456[/quote]

我想知道的就是 用哪一个bit来表示正负号(我只知道我这台机子是第24bit表示符号) ,用几个并且哪几个bits来指示指数值,用几个并且哪几个bits来保存2.3456  ?

3 楼

研究这个问题有什么意义呢?

4 楼

您可以在本论坛搜一下Fortran区的帖子,俺以前回过:)
http://bbs.pfan.cn/post-305860.html
上面就是俺和jfnano兄回的帖子:)

5 楼

我以前写的,你参考一下
http://blog.vckbase.com/bruceteen/articles/240.html

6 楼

一个FLOAT用思考这么长时间吗?买一本《汇编语言程序设计》给你讲的明明白白的!

7 楼

先谢谢cgl_lgs 和bruceteen给出的参考信息,我现在对float,double的表示也基本了解。还有强强说的学汇编,我非常接受,正在学。[quote]研究这个问题有什么意义呢?[/quote]
对于这个问题,我觉得学C语言 不仅仅需要了解它的语法,更深一部分的知识也有必要了解的。用C语言 探究C语言本身一些特性和其他的某方面,我想也是学习C语言的方法吧!

8 楼

float的存储是按照标准来的,其实严格来说已经不属于C语言本身的特性了

9 楼

下次发代码的时候,能不能写一下写这程序你的思路是怎么样的?要实现什么的要求?输入什么要期望得到什么结果?

10 楼




Good news [url=http://www.toppowerlevel.net]wow power leveling[/url] everyone! In light of the 5-year anniversary of World of Warcraft's release in Europe, which our American friends [url=http://www.mogxe.com/PowerLevel.php?gid=1]wow power leveling[/url] happened to celebrate last year, the European Blizzard team has reduced the prices [url=http://www.toppowerlevel.net/powerlist.php?fid=688]wow power leveling[/url] on both the World of Warcraft Classic product and the Battle Chest bundle [url=http://www.toppowerlevel.net/buy.php]world of warcraft gold[/url] which also includes the first World of Warcraft expansion, the Burning Crusade. [url=http://www.itao123.net]淘宝网[/url]The Warcraft Battlecry Mosaic has unveiled not one but two tiles today! [url=http://www.57tao.net]淘宝网女装[/url]
The picture count has reached 15,222 and with it unlocked the [url=http://www.ccqdiy.com]重庆团购[/url] two tiles and also unlocked two pieces of art to go with it:[url=http://www.toppowerlevel.net/buy.php]best wow gold[/url]
Black and white rendering of a crazed goblin [url=http://www.toppowerlevel.net/buy.php]cheapest wow gold[/url] poised to capture his adversaries in the Gnomish Net Gun.
Early sketch of Jaina's port town of Theramore, a place still haunted by the fallen king's name.

我来回复

您尚未登录,请登录后再回复。点此登录或注册