实例阐述浮点数解包运算过程
来源:互联网 发布:佛山正大数据恢复中心 编辑:程序博客网 时间:2024/05/17 02:49
本文来自 瑞仙的Erlang开发博客,转载请注明出处。
原文链接:http://blog.csdn.net/zhongruixian/article/details/21294855
浮点数在计算机中存储或传输时,常会遇到读出来的浮点数有N(N>10)位小数的问题,这里以Erlang实例阐述产生这种现象的原因。
浮点数的实现及其表现,详见:http://blog.csdn.net/zhongruixian/article/details/21292593
Erlang源码:
f(N) -> Bin = <<N:32/float>>, <<S:1, E:8, M:23>> = Bin, io:format("~n"), io:format("*---*----------*-------------------------*~n"), io:format("* s * eeeeeeee * mmmmmmmmmmmmmmmmmmmmmmm *~n"), io:format("*---*----------*-------------------------*~n"), io:format("* ~1.2.0B * ~8.2.0B * ~23.2.0B * ~n", [S, E, M]), io:format("*---*----------*-------------------------*~n"), io:format("~n"), E1 = E - 127, M1 = calc_m(lists:flatten(io_lib:format("~23.2.0B", [M]))), io:format("~n"), io:format("S = s = ~w~n", [S]), io:format("E = eeeeeeee - 127 = ~w - 127 = ~w~n", [E, E1]), io:format("M = ~w~n", [M1]), %% 计算公式:V=(-1)^S*2^E*M V = math:pow(-1, S) * math:pow(2, E1) * M1, io:format("V = (-1)^S*2^E*M = (-1)^~w*2^~w*~w = ~w~n", [S, E1, M1, V]), io:format("~n"), io:format("~ts ~w ~ts~w~n", [iolist_to_binary("浮点数"), N, iolist_to_binary("以[单精度]存储后根据公式(V=(-1)^S*2^E*M)运算出来的值为:"), V]), <<N1:32/float>> = Bin, io:format("~ts ~w ~ts~w~n", [iolist_to_binary("浮点数"), N, iolist_to_binary("以[单精度]存储后 Erlang解包出来的值为:"), N1]), io:format("~n"), f2(N).f2(N) -> io:format("~ts~n", [iolist_to_binary("双精度:")]), Bin = <<N:64/float>>, <<S:1, E:11, M:52>> = Bin, io:format("~ns,eeeeeeeeeee,mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm~n"), io:format("~1.2.0B,", [S]), io:format("~11.2.0B,", [E]), io:format("~52.2.0B,", [M]), io:format("~n"), <<N1:64/float>> = Bin, io:format("~ts ~w ~ts~w", [iolist_to_binary("浮点数"), N, iolist_to_binary("以[双精度]存储后再读取出来的值为:"), N1]), io:format("~n"), ok.calc_m(M) -> calc_m(M, -1, 0).calc_m([], _E, Rt) -> Rt1 = Rt + 1, io:format(" M = ~w~n", [Rt]), io:format(" 1 + M = ~w~n", [Rt1]), Rt1;calc_m([M | T], E, Rt) -> M1 = case M of 49 -> 1; 48 -> 0 end, V = M1 * math:pow(2, E), io:format("~w * 2^~3w = ~w~n", [M1, E, V]), calc_m(T, E - 1, Rt + V).
运行实例:
1 0
- 实例阐述浮点数解包运算过程
- 浮点运算
- 浮点运算
- Q:面对对象和面向过程的优缺点,结合实例进行阐述
- 实例阐述MapReduce中的基本概念
- 浮点寄存器及浮点运算
- ARM 浮点运算,软浮点,硬浮点
- ARM 浮点运算,软浮点,硬浮点
- 对位运算中问题的阐述
- 浮点运算简介
- 矩阵、浮点运算测试报告
- 浮点运算简介
- 浮点函数运算类
- 浮点运算简介
- 浮点运算误差
- 浮点运算指令集
- javascript浮点精确运算
- JavaScript 浮点数运算
- BitmapFactory.decodeResource加载图片缩小的原因及解决方法
- 布隆过滤器 序列化与反序列化
- Android应用程序显示欢迎画面并开机自启动
- Kinect for Windows SDK开发入门(五):景深数据处理 下
- 【Leetcode】Path Sum
- 实例阐述浮点数解包运算过程
- 深入理解 jdk 动态代理的实现
- c++模板技术
- 我的第一篇博文
- Cocos2D-x游戏开发之一:场景切换
- MFC (1)CAnimate Control 应用
- 我的第一周作业
- 链表,队列和栈的区别
- C#_为WinForm窗体定义功能快捷键