一:题目

尴尬的非会员水印

二:题目摘要

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);
}

最新文章

  1. 游戏编程技巧 - Type Object
  2. MongoDB查询操作限制返回字段的方法
  3. 淡扯javascript编程思想
  4. backbone todo example
  5. 单机版搭建Hadoop环境图文教程详解
  6. iOS 宏定义_16进制色值转化为RGB返回UIColor类型对象
  7. 如何唯一确定一台iOS设备
  8. css应用三
  9. python glob标准库基础学习
  10. web前端的学习误区
  11. Castle.DynamicProxy Part 1: ClassProxy
  12. 从UI开始
  13. 整合改造百度编译器到thinkphp上传图片到OSS
  14. Java集合中迭代器的常用用法
  15. shell编程--基本格式,基本语法,运算符,expr,(()),$[]
  16. Grunt的配置和使用
  17. DataRead和DataSet的异同
  18. Error: Cannot find module &#39;babel-runtime/regenerator&#39;
  19. 两个数字比较大小的方法 (分别应用if-else和条件运算符实现)
  20. FreeRTOS队列

热门文章

  1. jsx的本质
  2. Linux网络编程综合运用之MiniFtp实现(四)
  3. mysql - 所有笔记
  4. 约瑟夫问题O(n)/O(mlogn)
  5. Vue多语言支持
  6. 最短路--SPFA及其优化
  7. sql server 数据类型转换
  8. MongoDB 分片管理(四)数据均衡 -- 特大快
  9. Codeforces Global Round 4
  10. 【概率论】5-1:分布介绍(Special Distribution Introduction)