一:题目

尴尬的非会员水印

二:题目摘要

1.int和float比较

int共32位,可以表示的最大的数为2^32次方
float虽然也是32位,但是是以指数形式保存,指数占8位(含符号),最大127,则表示最大数为2^,可以表示到10^38次方数

2.float在内存中存在形式

其中尾数部分,默认前面省略了一个1

3.输入数据的范围

9.205357638345294e18
5.699141892149156e76 -->不能单纯用float表示
0e0
double类型指数占11位,最高可以表示到10^308次方,可以满足输入条件

三:解题思路

(一)整数部分除2,小数部分乘2

例如:19.625

整数

/ = ...
/=...
/=...
/=...
/=...
19 = 10011

小数

0.625* = 1.25   -->
0.25* = 0.5 -->
0.5* = 1.0 -->
0.625 = 0.101

(二)位数确定(2^10=1024)>10^3>(2^9=512)

Xe18位数范围为18/3*9到(18/3+1)*10之间--->其中18/3+1中+1是为了防止X带来的误差(例如X=8就是2^3,所以我们不妨直接将其扩大10位,即1*10)

(三)函数pow的参数是double类型,返回也是double类型

(四)为了在处理小数时方便计算,将double类型转float(两种保留位数不同,float位数较少)

四:数据展示

9.205357638345294e18
5.699141892149156e76
0e0
 

五:代码分析

(一)获取指数值

        bit = ;
while (temp>)
{
temp /= ;
bit++;
}
bit--;   //bit是整数位数(1000.1就是bit=3)
        for (bin_bit = bit / 3 * 9; bin_bit <= (bit / 3 + 1) * 10; bin_bit++)
{
if ((num / pow(2.0, bin_bit)) < 1)
break;
}
其中num是我们获取的需要处理的最大浮点数
bin_bit是根据三(二)中确定的值,循环次数从bit/3*9到(bit/3+1)*9,
当num/pow(2.0,bin_bit)小于1时,就是处理了所有的的指数值

(二)根据指数值,获取尾数值

        //指数是bin_bit位
//尾数是num / pow(2.0, bin_bit)
mant_val = num / pow(2.0, bin_bit); //double转float只是为了保留15位小数,方便后面比较运算
expo_val = bin_bit;

(三)根据三(一)获取指数值位数

        while (expo_val)
{
expo++;  //初始为0
expo_val /= 2;
}

(四)根据小数运算获取小数位数

        while (mant_val>1e-15)  //因为float有效位数15位
{
if (mant_val * 2 >= 1.0)
mant_val = mant_val*2 - 1;
else
mant_val = mant_val * 2; mant++;
}     
mant--; //因为有一个1被默认省略,所以减去

六:代码实现

//浮点数求尾数和指数位数
//整数部分除2,小数部分乘2
void test37()
{
double num, temp; //考虑位数,取double类型
int bit,bin_bit;
float mant_val; //尾数值
int expo_val; //指数值
int mant, expo;  //尾数位数和指数位数
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout); while ()
{
scanf("%lf", &num);  //注意:double类型读取时,使用lf
expo = mant = ; temp = num;
if (temp == )
break; bit = ;
while (temp>)
{
temp /= ;
bit++;
}
bit--; for (bin_bit = bit / * ; bin_bit <= (bit / + ) * ; bin_bit++)
{
if ((num / pow(2.0, bin_bit)) < )
break;
}
//指数是bin_bit位
//尾数是num / pow(2.0, bin_bit)
mant_val = num / pow(2.0, bin_bit); //double转float只是为了保留15位小数,方便后面比较运算
expo_val = bin_bit; while (expo_val)
{
expo++;
expo_val /= ;
} while (mant_val>1e-)
{
if (mant_val * >= 1.0)
mant_val = mant_val* - ;
else
mant_val = mant_val * ; mant++;
} mant--; //因为有一个1被默认省略,所以减去 printf("%d %d\n", mant, expo);
} freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}

算法习题---3.12浮点数(UVa11809)的更多相关文章

  1. 算法习题---5.12城市正视图<离散化应用>(Uva221)*****

    一:题目 给定n坐房子的西南角坐标x, y.还有宽度w,长度d(其实没用),高度h.问从南面看过去能看到几座房子. 城市俯视图和主视图 注意: 输出主视图中能够看到的所有建筑物按照左下角x坐标从小到大 ...

  2. [刷题]算法竞赛入门经典 3-12/UVa11809

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...

  3. 【算法习题】数组中任意2个(3个)数的和为sum的组合

    题1.给定一个int数组,一个数sum,求数组中和为sum的任意2个数的组合 @Test public void test_find2() { int[] arr = { -1, 0, 2, 3, 4 ...

  4. 基于verilog的FFT算法8点12位硬件实现

    FFT算法8点12位硬件实现 (verilog) 1 一.功能描述: 1 二.设计结构: 2 三.设计模块介绍 3 1.蝶形运算(第一级) 3 2.矢量角度旋转(W) 4 3.CORDIC 结果处理 ...

  5. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  6. 数据结构和算法(Golang实现)(12)常见数据结构-链表

    链表 讲数据结构就离不开讲链表.因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据. 一.链表 定义: 链表由一个个数据节点 ...

  7. [图形学] 习题8.12 NLN二维线段裁剪算法实现

    Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...

  8. 算法导论——lec 12 平摊分析与优先队列

    在平摊分析中,运行一系列数据结构操作所须要的时间是通过对运行的全部操作求平均得出.反映在不论什么情况下(即最坏情况下),每一个操作具有平均性能.掌握了平摊分析主要有三种方法,聚集分析.记账方法.势能方 ...

  9. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

随机推荐

  1. AlexNet网络的Pytorch实现

    1.文章原文地址 ImageNet Classification with Deep Convolutional Neural Networks 2.文章摘要 我们训练了一个大型的深度卷积神经网络用于 ...

  2. java中的strictfp的作用

    自Java2以来,Java语言增加了一个关键字strictfp,虽然这个关键字在大多数场合比较少用,但是还是有必要了解一下. strictfp 的意思是FP-strict,也就是说精确浮点的意思.在J ...

  3. 2.3 vue配置(上)

    rm,在打包之前把上一次打包之后的东西删掉,然后webpack重新打包 通过DefinePlugin形成一个环境变量 HTML打包插件

  4. HTML5 服务器发送事件(Server-Sent Events)

    沈阳SEO:HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获 ...

  5. Miniprofiler 监控ef执行详解

    首先NuGet添加 相对应ef版本的Miniprofiler.ef引用 web.config文件中添加 <system.webServer> <handlers>  <a ...

  6. jquery统计输入文字的个数并对其进行判断

    <textarea placeholder="该产品满足你的期待吗?说说你的使用心得,分享给 同样看中的他们吧"></textarea> <span ...

  7. How to Fix Broken Packages in Ubuntu

    How to Fix Broken Packages in Ubuntu By Nick Congleton – Posted on Jan 11, 2019 in Linux   Apt, Ubun ...

  8. 使用tfrecord建立自己的数据集

    注意事项: 1.关于输入图像格式的问题     使用io.imread()的时,根据输入图像确定as_grey的参数值. 转化为字符串之后(image.tostring) ,最后输出看下image_r ...

  9. ubuntu ukylin wineqq 登录时提示:您的号码暂时不能使用低版本的qq

    ubuntu ukylin wineqq 登录时提示:您的号码暂时不能使用低版本的qq,而有的qq号登录没有问题. 优麒麟官网上下载的qqwine安装包,解压后安装三个deb包. 郁闷了一下午,都想装 ...

  10. Python基础之可接受任意数量参数的函数

    1. 可接受任意数量位置参数的函数 为了能让一个函数接受任意数量的位置参数,可以在参数部分使用“*”. def avg(first, *rest): return (first + sum(rest) ...