双精度软件 ps版晒版精度控制软件 - 电脑 - 【南平电脑网】_南平电脑维修_南平笔记本电脑维修_监控安装_市区上门维修
公司动态

双精度软件 ps版晒版精度控制软件

摘要:请解释一下单精度和双精度。 单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(Float),顾名思义是通过浮动小数点来实现数据的存储。这两个数据类型最早...

发布日期:2020-08-26

双精度软件

请解释一下单精度和双精度。

单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(Float),顾名思义是通过浮动小数点来实现数据的存储。

这两个数据类型最早是为了科学计算而产生的,他能够给科学计算提供足够高的精度来存储对于精度要求比较高的数值。

但是与此同时,他也完全符合科学计算中对于数值的观念: 当我们比较两个棍子的长度的时候,一种方法是并排放着比较一下,一种方法是分别量出长度。

但是事实上世界上并不存在两根完全一样长的棍子,我们测量的长度精度受到人类目测能力和测量工具精度的限制。

从这个意义上来说,判断两根棍子是否一样长丝毫没有意义,因为结果一定是False,但是我们可以比较他们两个哪个更长或者更短。

这个例子很好地概括了单精度双精度数值类型的设计初衷和存在意义。

基于上述认识,单精度双精度数值类型从一开始设计的时候,就不是一个准确的数值类型,他只保证在他这个数值类型的精度之内是准确的,精度之外则不保证,比方说,一个数值5.1,很可能存储在单精度双精度数值中的实际值是5.100000000001或者5.09999999999999。

导致这个现象的原因我们可以通过两种方式来解释: 简单的解释方法: 你可以尝试在任何一个控件的属性面板中,设定他的宽度为:3.2CM,当你输入完毕后,你会发现值自动变成了3.199cm,无论你怎么改,你都无法输入 3.200CM,因为实际上在电脑中存储的并不是CM为单位的数值,而是“缇”为单位的数值,而“缇”和CM之间的比值,是个很难被除尽的数,因此你输入完毕后,电脑自动转换成了最接近的“缇”值,然后再转换成厘米显示到属性面板上,这一乘一除,两次四舍五入,误差就出来了。

单精度双精度也是类似的原理,其实在二进制存储的时候,单精度双精度都采用了类似相近分数的方法,而这样的存储是不可能做到准确的。

深入的解释方法: 让我们来看看我们存储到数字介质中的单精度双精度值到底是怎么样的,我们使用如下代码对单精度类型进行一个解剖: Pulic Declae Su CopyMemoy Li "kenel32" Alias "RtlMoveMemoy" (Destination As Any, Souce As Any, ByVal Length As Long) Pulic Su floatTest() Dim dlVa As Single dlVa = 5.731 8 dlOutput dlVadlVa = dlVa * 2 dlOutput dlVadlVa = dlVa * 2 dlOutput dlVadlVa = dlVa * 2 dlOutput dlVadlVa = dlVa * 2 dlOutput dlVadlVa = dlVa * 2 dlOutput dlVaEnd SuPulic Su dlOutput(ByVal dlVa As Single) Dim ytVa(3) As Byte Dim i As Intege, j As IntegeDim stVa As Sting CopyMemoy ByVal VaPt(ytVa(0)), ByVal VaPt(dlVa), 4 stVa = dlVa & ": " Fo i = 3 To 0 Step -1 Fo j = 7 To 0 Step -1 stVa = stVa & (ytVa(i) And 2 ^ j) 2 ^ j Next j stVa = stVa & " " Next i Deug.Pint stVaEnd Su运行后我们得到输出结果(输出格式为高位左,低位右): .716375: 00111111 00110111 01100100 01011010 1.43275: 00111111 10110111 01100100 01011010 2.8655: 01000000 00110111 01100100 01011010 5.731: 01000000 10110111 01100100 01011010 11.462: 01000001 00110111 01100100 01011010 22.924: 01000001 10110111 01100100 01011010 这里,我们把单精度类型转化成了二进制数据输出,这里我们看到,虽然这六个数字完全不同,但是他们的二进制存储惊人地相似,我们看到红色标记部分,每次都是加1,事实上,单精度数据类型使用从高位开始第1位作为正负标记位(绿色),第2位到第9位,是一个跨字节的有符号字节类型数据,这个数值决定了小数点移动的方向和位数(红色),第10位到32位保存一个整数(蓝色)在存储过程中,电脑首先把输入的值不断移位(乘除2)直到这个数的整数部分占用了全部 24位的整数位,然后把移动的位数写入浮点部分(红色),而移位后的结果写入整数部分(蓝色和绿色),小数部分则舍弃。

求值的时候则是反向过程,先根据正负位和整数位求值,然后根据红色部分的整数来进行移位(乘除2的次方),最终才是我们得到的单精度数值。

双精度数值也是同样原理,只是位数更多而已。

通过解剖单精度数值的二进制存储格式,我们可以清楚看到,实际上单精度双精度的存储,都要通过乘法和除法,其中必有舍入,如果恰好你的数值在除法中被舍入了,那么你赋的初值就很可能与你最终存储的值不完全相同,其中的微小差异,并不与单精度双精度的设计目标相违背。

当我们在数据库中或者VBA代码中使用一个单精度双精度数值的时候,也许你从界面上看不到区别,但是在实际的存储中,这个差别却真真切切地就在那里,当你对其进行相等比较的时候,系统只是简单地作二进制的比较,界面上无法体现的微小差异,在二进制比较面前却无处遁形,于是,你的等于比较返回了一个意料之外的False。

参考资料:百度

请问CAXA软件标注的精度能达到多少?

CAXA的尺寸精度可以达到小数点后7位,他的公差精度可以达到小数点后5位。

Auto的尺寸精度暂不能查得,我的经验是两个差不多。

从历史的角度我BS Auto cad。

原因就不多说了。

不论CAXA CAD 还是 AUTO CAD,你都可以在尺寸标注样式里的尺寸精度一栏中设置,你自己可以根据需要设置。

不论CAXA CAD还是auto cad,他们程序内部实数变量都是双精度浮点数。

双精度的8字节是不是32位系统不存在

单精度是float, 双精度是 double; 在32位机器上, float 只有4个字节,精确到小数点后 6位;double有8个字节, 精确到小数点14位之后C++浮点常量默认的是double型,比如 3.14 默认是double型, 要将浮点型常量改成float型后加F后缀,比如 3.14F是浮点型C++最好使用 double 型,double精度高,且float 型未必运算速度比double 快。

Excel 求教:单精度浮点型与双精度浮点型的问题

求教,今天学习突然发现个问题,同样的代码,一个申明变量为单精度浮点型,一个申明变量为双精度浮点型,但是结果却不一样 a=3.11999988555908 b=3.12 代码: Sub test2() Const a As Single = 3.12 Const b As Double = 3.12 Range("A1") = a Range("B1") = b End Sub 结果在excel中如图 这样的话定义单精度浮点型不是没用,以后小数不是都要定义为双精度浮点型了吗? 浮点数的误差是一定存在,并且无法消除。

永远不要直接比较两个浮点数。

比较的时候要先round。

把电脑中的浮点运算误差找出来 - 任何人的电脑都会有这个误差的 很多人在日常使用Excel,可能都没有注意到浮点小数带来的计算误差问题因为日常使用的运算结果,肯定都是四舍五入之后的结果,可以排除浮点误差的影响但是,浮点小数的误差,也会出现在运算的过程,有可能导致最终结果出错。

比方说 countif(A1:A10000,"=B1")这样的简单统计,也有可能出错。

附件生成5万个随机小数(四舍五入到2位小数位),加上然后马上减去同一个整数对比计算前后的数值是否相等(数学上当然是绝对相等的,但是电脑的运算结果就不一定了。

)附件会自动找出一批在你的电脑上会出现浮点小数误差导致错误的运算。

出现浮点小数运算误差的原因很简单,小数有无穷多个甚至一个小数也有无穷多位,如十进制的1/3,或者二进制的0.1所以计算机存储小数的时候,必定只能存储所有小数的一部分,而无穷小数则必须截断因此,一个小数有时候就只能取一个接近值而不是精确值而对应的浮点数运算,也只能得到接近值,而不是精确值不同的CPU,比方说Intel的跟AMD的,或者奔腾跟赛扬,在硬件上对于截断的位置是不一样的所以,同一个运算在不同的机器就可能有不同的结果这也是为什么论坛经常有人说xx运算不正确,然后回帖的人说我的机器没事,其实就是CPU不同而已另一方面,不同的软件,内部计算的时候,也许用了不同的CPU硬件实现的数据类型,或者精度设置也不一样,所以,同一个运算在不同的软件也可能有不同的结果编程,写公式要注意,假设 x,y 都是浮点数,er。

excel的每个小数单元格都是浮点数那么永远不要写 if x=y 这样的句子,因为很可能数学上相等的x和y,在计算机内部是不等的应该写成 if |x-y| / max(|x|,|y|) <= 0.0000000000001 之类或者简单一点,用if round(x) = round(y) 来判断,这样最末一位的尾数浮点存储误差就不会影响整个数值了。

幸运的是,整数和定点小数不会受影响,编程时应该优先考虑使用整数和定点小数类型另一方面,即使浮点小数可以完全表示我们要计算的数值,但是计算结果却也有可能产生误差浮点,定点的意思是指小数点的位置定点小数:小数点位置固定。

以十进制为例,假设一个数值类型可以有6个十进制位置,那么定点类型无须记录小数点位置,可以有以下类型:整数类型,小数点位置就一定是个位后面,能够表达的最精确数字就是1,能够表达的范围是 000000 - 999999两位小数类型,小数点位置就一定是百分位,能够表达的最精确数字就是0.01,,能够表达的范围是 0000.00 - 9999.99。

等等浮点小数:小数点位置可以变动,并且需要额外的记录去描述这个变动的小数点位置。

假设这里把其中一个位置用于记录小数点位置(可变范围 0-9),并且规定:小数点位置取5,表示精度是1,小数点在个位后面,这个数值类型有0个小数位,可以表示 00000 到 99999 的数 (注意:这里只有5位有效数字)小数点位置取6,表示精度是 0.1,小数点在十分位后面,这个数值类型有1个小数位,可以表示 0000.0 到 9999.9 的数小数点位置取9,表示精度是 0.0001,小数点在万分位后面,这个数值类型有4个小数位,可以表示 0.0000 到 9.9999 的数......小数点位置取4,表示精度是 10,表示小数点在十位,这个数值类型可以表示 00000 x 10 到 999990 的数,精度是 10......小数点位置取0,表示精度是 100000,表示小数点在十万位,这个数值类型可以表示 00000 x 100000 到 9999900000 的数,精度是 100000可见浮点小数通过可变的小数位置,使一个数值类型可以用一部分表示有效数字,另一部分表述每一单位有效数字的倍率从而灵活地表示很大范围的数值,代价是:由于用了一部分记录内容去记录小数点位置,所以有效数字的长度比定点小数要低。

而且,一些定点数运算不会出现的问题,在浮点数运算会出现如两个数相加如果第一个浮点数是 100.01,第二个浮点数是 9999900000按上述规则,这两个都是合法的浮点数,可是它们的和 99999000100.01 却无法用同一个浮点数类型表示出来。

一般计算机碰到这种情况,就会自动按比较大的数值来四舍五入,于是100.01 + 9999900000 = 9999900000 (出现了100.01的误差)这也是浮点数误差产生的一个原因:小的数值被大的数值“吸收”了。

要在Excel证明这一点就太简单了,因为excel的double类型浮点小数只有15个有效数字(即最多记录15个十进制数字)所以Excel的单元格运算 12345012345678900000 + 12345.0123456789 = 12345012345678900000 -------------------------------...

用易语言做一个屏幕尺子软件

.版本 2.程序集 窗口程序集1.程序集变量 起点X.程序集变量 起点Y.程序集变量 px, 整数型.程序集变量 py, 整数型.子程序 _画板1_鼠标左键被按下, 逻辑型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 时钟1.时钟周期 = 10 起点X = 横向位置 起点Y = 纵向位置.子程序 _画板1_鼠标左键被放开, 逻辑型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 时钟1.时钟周期 = 0.子程序 _时钟1_周期事件.局部变量 a, 双精度小数型.局部变量 b, 双精度小数型.局部变量 c, 双精度小数型.局部变量 cosA, 双精度小数型.局部变量 cosB, 双精度小数型.局部变量 cosC, 双精度小数型.局部变量 tanA, 双精度小数型.局部变量 tanB, 双精度小数型.局部变量 tanC, 双精度小数型.局部变量 pi, 双精度小数型.局部变量 角A, 文本型.局部变量 角B, 文本型.局部变量 角C, 文本型 画板1.清除 (0, 0, 取屏幕宽度 (), 取屏幕高度 ()) 画板1.画笔颜色 = #绿色 画板1.画直线 (起点X, 0, 起点X, 取屏幕高度 ()) 画板1.画直线 (0, 起点Y, 取屏幕宽度 (), 起点Y) 画板1.画笔颜色 = #蓝色 画板1.画直线 (0, 取鼠标垂直位置 (), 取屏幕宽度 (), 取鼠标垂直位置 ()) 画板1.画直线 (取鼠标水平位置 (), 0, 取鼠标水平位置 (), 取屏幕高度 ()) 画板1.画笔颜色 = #红色 画板1.画直线 (起点X, 起点Y, 取鼠标水平位置 (), 取鼠标垂直位置 ())" -------------------------------------------------------------------------------------------------- a = 取绝对值 (取鼠标水平位置 () - 起点X) * 25.4 ÷ px " 像素转毫米 b = 取绝对值 (取鼠标垂直位置 () - 起点Y) * 25.4 ÷ py " 像素转毫米 c = 求平方根 (求次方 (a, 2) + 求次方 (b, 2)) " 求对边 cosA = (b * b + c * c - a * a) ÷ (2 * b * c) cosB = (a * a + c * c - b * b) ÷ (2 * a * c) cosC = (a * a + b * b - c * c) ÷ (2 * a * b) tanA = 求平方根 (1 ÷ (cosA * cosA) - 1) tanB = 求平方根 (1 ÷ (cosB * cosB) - 1) tanC = 求平方根 (1 ÷ (cosC * cosC) - 1) pi = 3.14159265359.如果 (cosA = 0) 角A = “90”.否则 角A = 到文本 (选择 (cosA > 0, 0, 180) + 选择 (cosA > 0, 1, -1) * 求反正切 (tanA) * 180 ÷ pi).如果结束.如果 (cosB = 0) 角B = “90”.否则 角B = 到文本 (选择 (cosB > 0, 0, 180) + 选择 (cosB > 0, 1, -1) * 求反正切 (tanB) * 180 ÷ pi).如果结束.如果 (cosC = 0) 角C = “90”.否则 角C = 到文本 (选择 (cosC > 0, 0, 180) + 选择 (cosC > 0, 1, -1) * 求反正切 (tanC) * 180 ÷ pi).如果结束.判断开始 (取鼠标垂直位置 () 画板1.文本颜色 = #绿色 画板1.置写出位置 (起点X, 起点Y) 画板1.写文本行 (“X:” + 到文本 (起点X), “Y:” + 到文本 (起点Y), “角:” + 角B) 画板1.文本颜色 = #蓝色 画板1.置写出位置 (取鼠标水平位置 (), 取鼠标垂直位置 ()) 画板1.写文本行 (“X:” + 到文本 (取鼠标水平位置 ()), “Y:” + 到文本 (取鼠标垂直位置 ()), “角:” + 角A).默认 画板1.文本颜色 = #绿色 画板1.置写出位置 (起点X, 起点Y) 画板1.写文本行 (“X:” + 到文本 (起点X), “Y:” + 到文本 (起点Y), “角:” + 角A) 画板1.文本颜色 = #蓝色 画板1.置写出位置 (取鼠标水平位置 (), 取鼠标垂直位置 ()) 画板1.写文本行 (“X:” + 到文本 (取鼠标水平位置 ()), “Y:” + 到文本 (取鼠标垂直位置 ()), “角:” + 角B).判断结束 画板1.文本颜色 = #品红 画板1.置写出位置 (起点X, 取鼠标垂直位置 ()) 画板1.写文本行 (“底:” + 到文本 (a), “高:” + 到文本 (b), “边:” + 到文本 (c)) 画板1.置写出位置 (取鼠标水平位置 (), 起点Y) 画板1.写文本行 (“底:” + 到文本 (a), “高:” + 到文本 (b), “边:” + 到文本 (c), “角:” + 角C).子程序 __启动窗口_创建完毕 _启动窗口.移动 (0, 0, 取屏幕宽度 (), 取屏幕高度 ()) 画板1.移动 (0, 0, 取屏幕宽度 (), 取屏幕高度 ()) 画板1.底图 = 快照 (, , ) px = 取DPI (取设备场景 (取屏幕句柄 ()), #LOGPIXELSX) py = 取DPI (取设备场景 (取屏幕句柄 ()), #LOGPIXELSY)--------------------------------------------------------------------------------------------.版本 2.DLL命令 取设备场景, 整数型, "user32", "GetDC", , 获取指定窗口的设备场景 指定窗口的设备场景句柄,出错则为0 .参数 窗口的句柄, 整数型, , 将获取其设备场景的窗口的句柄。

若为0,则要获取整个屏幕的DC;.DLL命令 取屏幕句柄, 整数型, "user32", "GetDesktopWindow".DLL命令 取DPI, 整数型, "gdi32", "GetDeviceCaps" .参数 设备场景, 整数型, , 要查询其设备的信息的设备场景 .参数 值, 整数型, , 根据GetDeviceCaps索引表所示常数确定返回信息的类型;------------------------------------------------------------------------------------------------------------------.版本 2.常量 LOGPIXELSX, "88".常量 LOGPIXELSY, "90"