浮点数

float与double的范围和精度

半城伤御伤魂 提交于 2020-04-11 17:49:39
范围 float和double的范围是由指数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) 于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。 其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。 float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。 精度 float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。 float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

0.1+0.2结果却不等于0.3

拈花ヽ惹草 提交于 2020-04-07 05:33:44
先看几个简单但诡异的代码: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.010000000000000002 1000000000000000128 === 1000000000000000129 0.1加0.2为什么就不等于0.3昵?要回答这个问题,得先了解计算机内部是如何表示数的。 计算机内部如何表示数 我们都知道,计算机用位来储存及处理数据。每一个二进制数(二进制串)都一一对应一个十进制数。 1. 计算机内部如何表示整数 这里以十进制数13来展示“按位计数法”如何表示整数: 十进制值 进制 按位格式 描述 13 10 13 1x10^1 + 3x10^0 = 10 + 3 13 2 1101 1x2^3 + 1x2^2 + 0x2^1 + 1x2^0 = 8 + 4 + 0 + 1 2. 计算机内部如何表示小数 再看小数怎么用按位计数法表示,以十进制数0.625为例: 十进制值 进制 按位格式 描述 0.625 10 0.625 6x10^-1 + 2x10^-2 + 5x10^-3 = 0.6 + 0.02 + 0.005 0.625 2 0.101 1x2^-1 + 0 x2^-2 + 1x2^-3 = 1/2 + 0 + 1/8 3. 如何用二进制表示0.1 关于十进制与二进制间如何转换,这里不细说,直接给出结论: 十进制整数转二进制方法

第七周作业

房东的猫 提交于 2020-04-06 20:24:13
要求一: 《usth-C语言基础-第七周作业》 : 对不起,由于本人错过了提交时间,第七周作业无法完成 《usth-C语言基础-12周PTA作业》 : 7-3 求交错序列前N项和(本题为以"USTH_C程序设计(基础)第五次(循环01)PTA作业"中的7-2为提交是否成功标准,如有与原题有误请见谅): 1.实验代码: #include <stdio.h> int main() { int N,M=1; double A=0; scanf("%d",&N); while(N>=M) { double S=M/(double)(2*M-1); if(M%2==0) S=-S; A+=S; M++; } printf("%.3lf",A); } 2 设计思路: (1)文字表示: 第一步:将题目要求输入的数N定义为整型以满足“给出一个正整数N”,将题目要求输出的数字A,定义为双精度浮点数型以满足"结果保留三位小数",另外定义一个初始值为1的数M为整形以表示"执行循环的次数"; 第二步:根据M与N的关系决定是否执行循环语句:定义一个双精度浮点数S作为当前分数,并根据其所在位置判断其为正数亦或者为负数,然后将S与代表结果的A相加; 第三步:输出结果A的数值; (2)流程图: 3.本题调试过程碰到问题及解决办法 本题由于本人错过了提交时间,无法进行调试; 4.本题PTA提交列表

C\\C++代码优化的27个建议

喜你入骨 提交于 2020-04-06 11:52:34
1. 记住 阿姆达尔定律 : funccost 是函数func运行时间百分比, funcspeedup 是你优化函数的运行的系数。 所以,如果你优化了函数 TriangleIntersect 执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。 这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。 这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正确运行。 2. 代码先保证正确,然后再考虑优化 这并不意味着用8周时间写一个全功能的射线追踪算法,然后用8周时间去优化它。 分多步来做性能优化。 先写正确的代码,当你意识到这个函数可能会被经常调用,进行明显的优化。 然后再寻找算法的瓶颈,并解决(通过优化或者改进算法)。通常,改进算法能显著地改进瓶颈——也许是采用一个你还没有预想到的方法。所有频繁调用的函数,都需要优化。 3. 我所了解的那些写出非常高效代码的人说,他们优化代码的时间,是写代码时间的两倍。 4.跳转和分支执行代价高,如果可能,尽量少用。 函数调用需要两次跳转,外加栈内存操作。 优先使用迭代而不是递归。 使用内联函数处理短小的函数来消除函数调用开销。 将循环内的函数调用移动到循环外(例如,将 for(i=0;i <100;i++) DoSomething(); 改为 DoSomething() { for(i=0;i <100;i++)

C\\C++代码优化的27个建议

这一生的挚爱 提交于 2020-04-06 10:35:18
1. 记住 阿姆达尔定律 : func cost 是函数func运行时间百分比, func speedup 是你优化函数的运行的系数。 所以,如果你优化了函数 TriangleIntersect 执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。 这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。 这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正确运行。 2. 代码先保证正确,然后再考虑优化 这并不意味着用8周时间写一个全功能的射线追踪算法,然后用8周时间去优化它。 分多步来做性能优化。 先写正确的代码,当你意识到这个函数可能会被经常调用,进行明显的优化。 然后再寻找算法的瓶颈,并解决(通过优化或者改进算法)。通常,改进算法能显著地改进瓶颈——也许是采用一个你还没有预想到的方法。所有频繁调用的函数,都需要优化。 3. 我所了解的那些写出非常高效代码的人说,他们优化代码的时间,是写代码时间的两倍。 4.跳转和分支执行代价高,如果可能,尽量少用。 函数调用需要两次跳转,外加栈内存操作。 优先使用迭代而不是递归。 使用内联函数处理短小的函数来消除函数调用开销。 将循环内的函数调用移动到循环外(例如,将 for(i=0;i <100;i++) DoSomething(); 改为 DoSomething() { for(i=0;i <100;i+

常用正则表达式

心已入冬 提交于 2020-04-02 21:55:47
  匹配中文字符的正则表达式: [\u4e00-\u9fa5]   评注:匹配中文还真是个头疼的事,有了这个表达式就好办了   匹配双字节字符(包括汉字在内):[^\x00-\xff]   评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)   匹配空白行的正则表达式:\n\s*\r   评注:可以用来删除空白行   匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? />   评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力   匹配首尾空白字符的正则表达式:^\s*|\s*$   评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式   匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*   评注:表单验证时很实用   匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*   评注:网上流传的版本功能很有限,上面这个基本可以满足需求   匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$   评注:表单验证时很实用   匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}   评注

01.JS基本语法-数据类型和变量

老子叫甜甜 提交于 2020-04-01 04:58:59
:JavaScript代码可以直接嵌在网页的任何地方,但一般写在之间,必须要有自己的闭标签 JS的基本结构 <script type="text/javascript"> <!-- JavaScript 语句; --> </script > JS只能在客户端执行,并且不能操作服务器端 引入这个文件 ②JavaScript严格区分大小写 <html> <head> <script src="/static/js/abc.js"></script> </head> <body> ... </body> </html> 变量 变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,声明变量赋值时指明数据类型: var width=5; var a; // 申明了变量a,此时a的值为undefined var $b = 1; // 申明了变量$b,同时给$b赋值,此时$b的值为1 var s_007 = '007'; // s_007是一个字符串 var Answer = true; // Answer是一个布尔值true var t = null; // t的值是null var:提前声明 可以不声明之间赋值【不推荐】 注意 : JavaScript严格区分大小写 js是一门动态语言 strict模式

Python Print函数用法

谁说胖子不能爱 提交于 2020-03-31 04:11:24
Python print 函数用法, print 格式化输出 使用 print 输出各型的 字符串 整数 浮点数 出度及精度控制 strHello = 'Hello Python' print strHello #输出结果:Hello Python#直接出字符串 1.格式化输出整数 python print 也支持参数格式化,与C言的printf似, strHello = "the length of (%s) is %d" %('Hello World',len('Hello World')) print strHello #输出果:the length of (Hello World) is 11 2.格式化输出16制整数 nHex = 0x20#%x --- hex 十六进制#%d --- dec 十进制#%d --- oct 八进制 print "nHex = %x,nDec = %d,nOct = %o" %(nHex,nHex,nHex) #输出结果:nHex = 20,nDec = 32,nOct = 40#使用整数的各个制打印同一个数 3.格式化输出浮点数(float) import math#default print "PI = %f" % math.pi#width = 10,precise = 3,align = left print "PI = %10

c++格式化输出

亡梦爱人 提交于 2020-03-30 08:17:42
以下操作符的使用必须要引入头文件<iomanip> 输出操作符号: 流操作符 描述 setw(n)         为下一个值的输出设置最小打印字段宽度为n fixed         以固定点(例如小数点)的形式显示浮点数 showpoint       显示浮点数的小数点和尾数0,即使没有小数点部分 setprecision(n)     设置浮点数的精度 left           使后续输出左对齐 right           使后续输出右对齐 来源: https://www.cnblogs.com/ruigelwang/p/12596398.html

Python数据类型

血红的双手。 提交于 2020-03-30 06:28:17
一、整数 1、Python可以处理任意大小的整数,当然包括负整数,在Python程序中, 整数的表示 方法和数学上的写法一模一样,例如:1,100,200,-480等等。 2、也可以使用十六进制方式来表示一个整数,例如:0x123、0xff等等。 二、浮点数 1、浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时, 一个浮点数的小数点位置是可变的,比如,1.23x10 ^9 和12.3x10 ^8 是相等的。 浮点数可以用数学写法,如1.3、20.1、2.31、-8.5等。但是对于很大或很小 的浮点数,就必须用科学计数法来表示,例如:1.23x10^9 = 1.23e9、 1.23x10^8 = 1.23e8等等。在Python中,可以使用数学的写法也可以使用 科学计数法来表示一个浮点数,例如:"print -5.2"、"print 1.23e9"等。 2、整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的 (除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。 三、字符串 字符串是以''或""括起来的任意文本,比如'abc',"xyz"等。这跟shell脚本语言 中字符串的表示是很相似的,''和""本身并不属于字符串的一部分。 四、布尔值 1、布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么 是True