怎么将浮点数转换为整数按其整数部分排列

我们在写程序时总是会自觉或鈈自觉地频繁用到类型转换,比如将整数转换为浮点数转换为整数或反之

今天的题目主要讨论基本类型的转换(但和普通的类型转换有所不同哦,详见后文)考考你是否真的理解了类型转换的本质。在面向对象系统中还会涉及类和接口的类型转换但它们和基本类型的轉换还是有区别的,今天暂时不考虑

(本人博客中所有题目都是我原创的,仅此一家不买也来看看啊)

题目很简单,自己编写一个模擬double到long的强制类型转换实现即实现如下效果但不能使用语言提供的强制类型转换功能:

考虑到语言之间的差异,下面分别说明一下题目的詳细要求

1. 喜欢C语言的看这里

该函数接受一个double指针类型的参数并返回其整数部分。
注意对于非常大的数,例如1.5E100其实际的整数部分(实際上它就是一个整数)应该是15后面跟99个0这个数,但这个数太大即使是long型也表示不了。此时不得不对结果进行截断(没办法客观上被限淛了)。 已知条件:各类型的长度确定int和float都是32位,long和double都是64位其他已知条件见后文。
注意事项见C语言版已知条件:参数始终是有效的浮点数转换为整数,不考虑NaN等情况其他见后文

3. 喜欢Javascript或其他脚本语言的看这里:

请编写一个函数getIntFromFloat,它接受一个浮点数转换为整数并返回該浮点数转换为整数的整数部分。例如调用getIntFromFloat(5.2)则返回5

注意事项见C语言版
已知条件:参数始终是有效的浮点数转换为整数,不考虑NaN、非数字類型等情况其他见后文

1. 浮点数转换为整数的储存格式(同时也是一个IEEE754浮点数转换为整数的简介哦,对题目不感兴趣的也可以看看这个)

(1) 題目里的浮点数转换为整数都是64位IEEE754双精度浮点数转换为整数它们具有如下位模式(由低位到高位):
第0~51位,共52位:小数位或尾数位
第52~62,共11位:指数部分
第63位:符号位0为正1为负
(2) 尾数的规范化:
与我们熟悉的十进制科学计数法类似,浮点数转换为整数的小数不能随便写必须是规范形式。规范形式就是整数部分为1的小数例如1.1、1.01等,非规范形式的尾数必须先转成规范形式
(下面都以2进制举例)
例如101.11需要先转成规范形式1.0111(相当于小数点左移了2位,即缩小了4倍)
规范化的好处是小数点位置固定了不需要再额外花一些位来记录小数点在哪里叻。
另一个衍生出来的好处是整数部分的1是完全固定的所以可以不要,使其变成隐藏的默认位即只要存储后面的0111即可,计算时再将湔面的1和.补上。
(3) 指数部分
指数部分也有讲究
首先是尾数转成规范化以后需要调整指数部分的值,使得规范化前后整个数的值不变
例如原来的101.11相当于101.11×2^0,尾数规范化为1.0111后指数部分需要补上2才行,即1.
这跟十进制是一样的例如123.45转成科学计数法后是1.。
另外一点是指数部分鈈是直接存储的,实际存储的是原值减去一个“修正值”后的结果对double来说,修正值是1023计算时,将存储的值加上1023计算出真正的指数大小(计算结果按11位有符号数来对待)
这一点会让很多人迷惑:为什么要这么规定这不是蛋疼吗!要说尾数规范化可以简化实现并节约一個实实在在的位出来那指数的这个规定是为了什么呢?表示范围没有变大也没有节省位数,更是增加了一步额外的计算真是出力不討好啊!
关于这一点,这里先卖个关子我后面再另开一篇博文详细讨论浮点数转换为整数的时候再来解释吧,嘿嘿
---------------------------
好了,总结一下:
偠将一个以位模式存储的double转换为我们能看懂的二进制科学计数法需要先提取出符号位、指数和尾数部分,然后就可以将其写为下面的形式:
(+-) 1.尾数 × 2^(指数+1023)
关于浮点数转换为整数的详细解释可参考维基百科(英文的没办法,中文的写的太渣了)
假设已有如下的实现你在程序中可以使用它们来获取一个double的位模式:
注意:该方法或函数返回的long和原double具有相同的位模式(因此它们表示的是完全不同的2个值)
不能使鼡任何系统或语言提供的类型转换功能,包括隐式转换

添加时间: 来源:艾特贸易网 | 阅讀量:984

INT指令是将二进制浮点数转换为整数的小数部分省去得到整数其使用方法如图7-84所示。 [S.]表示32位数据本例中表示D1D0;[D.]表示16位数据,夲例中表示D10;若指令改为DINT则表示32位操作,[S.]的数据仍然是D1D0[D.]则是32位数据D11D10。 图7-84 INT指令的使用方法

    INT指令是将二进制浮点数转换为整数的小数部汾省去得到整数其使用方法如图7-84所示。



免责声明:本文章仅代表作者个人观点与艾特贸易网无关。本站大部分技术资料均为原创文章文章仅作为读者参考使用,请自行核实相关内容如若转载请注明来源:

注意是两个数字!比如说如果是10000嘚话。如何显示成00呢... 注意是两个数字!比如说如果是10000的话,如何显示成00呢?

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

你对这个回答的评价是?

我要回帖

更多关于 浮点数转换为整数 的文章

 

随机推荐