不同语言的计算精度和范围


Published: 2017-04-13 21:05:00

In Program.

tags: Scala

不同语言的计算精度和范围问题

精度是数字中的数字个数,浮点数在计算机中的表达有限制,不能以任意精度存储
尤其是微小的或巨大的数字在运算时经常会有些意外情况,
在处理大数据的时候,数据量大,其中的一些关于数据量的运算很可能造成结果在少量数据时正常,而在大量数据时运算出现错误的情况。

说明

采用计算机计算数据的时候,数据的精度和数据的范围一定要注意,这方面的问题很隐蔽,在这里总结一下,
计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,
这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差,是实数的无限精度跟计算机的有限内存之间的矛盾
通用语言中的浮点数都是按照 IEEE 754是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)
浮点数的格式(包括负零-0)与反常值(denormal number),一些特殊数值(无穷(Inf)与非数值(NaN))
作为常识,不管是JAVA还是其它语言,我们都应该知道:
0.1+0.2 不一定等于0.3 。
1/3 * 3 不一定等于1 。
log2 + log5 也不一写等于1 。
把这个当作常识,精度有点损失似乎就没有影响了--可以在不同的语言中中输入,然后查看结果

C语言

C语言中的计算精度
    double
    可自行设计算法实现精度的再次升级--这个以后再说吧

Java/Scala

BigInt  BigDecimal类来进行计算
BigDecimal,用来对超过16位有效位的数进行精确的运算
BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
Java语言中
  数学运算和计算机计算的不同之处
    数学运算:1/3
      计算机运算:1/3.toDouble
      计算机运算:1/3.0
  Math.floor()返回不大于的最大整数
  Math.round()--round方法,它表示“四舍五入”,
    算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,
    所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
  Math.ceil 则是不小于的最小整数

Scala语言中
    数据类型
        scala.math.BigInt
        scala.math.BigDecimal
    //保留两位小数
    val a = 3.1415926
    val b =  a.formatted("%.2f")
举例:
    极大值运算
    choose() 超过choose(200,160),则会出现问题
          def choose(n: Int, k: Int): Int ={
               if (k == 0 || k == n) 1
               else choose(n - 1, k - 1) + choose(n - 1, k)
             }
            因为后面的数据会超出Int存储的范围---修改方法,将返回值设为Double

Python

Python默认的是17位精度,也就是小数点后16位
     一般的情况,四舍五入和使用格式化控制
     math模块的ceil(x)  取大于或者等于x的最小整数。
     math模块的floor(x)  --
        from math import ceil, floor
        ceil(2.5)
高精度使用decimal模块,配合getcontext

R 语言

R 语言数据超过千万的时候,要注意数据类型转换 int--numri
Double数据类型中
    最大 和最小 1e-316

1/3*3  在R语言里是1   NA(not available)

R语言出现无穷(Inf)与非数值(NaN)的时候,考虑是不是数值计算的原因
默认双精度型数据(double-precision)
    floor():向下取整;
    ceiling(): 向上取整;
    round(): 四舍五入取整;
    turnc(): 向0取整;
    signif(): 保留给定位数的精度。
注意字符型数值和数字型数值的区别
        numeirc
        character

SQL语言中

在数值处理功能时,MySQL能给出极其精确的结果,并能对无效值进行高度控制
定义良好的四舍五入特性:对于准确值数值,ROUND()的结果取决于其参量
    convert(decimal(8,6),(63883.63/23625))

使用对数值排序的时候,一定要查看数据定义的类型,string也会显示为数字,但是排序方式是有所不同的
    注意字符型数值和数字型数值的区别
    这个和Excel中文本型数值和数字型数值类似,Excel中还有公式数据。

原文:大专栏  不同语言的计算精度和范围

原文地址:https://www.cnblogs.com/chinatrump/p/11614917.html

时间: 2024-10-11 00:35:39

不同语言的计算精度和范围的相关文章

JS数字计算精度误差的解决方法

本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助. 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0.2 = 0.3 啊,那还用问吗?连幼儿园的小朋友都会回答这么小儿科的问题了.但是你知道吗,同样的问题放在编程语言中,或许就不是想象中那么简单的事儿了. 不信?我们可以做个试验. 先来看一段 JS. var num1 = 0.1; var num2 = 0.2; alert(num1+num2 ===

javascript避免数字计算精度误差的方法详解

本篇文章主要是对javascript避免数字计算精度误差的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 如果我问你 0.1 + 0.2 等于几?你可能会送我一个白眼,0.1 + 0.2 = 0.3 啊,那还用问吗?连幼儿园的小朋友都会回答这么小儿科的问题了.但是你知道吗,同样的问题放在编程语言中,或许就不是想象中那么简单的事儿了.不信?我们先来看一段 JS. var numA = 0.1; var numB = 0.2; alert( (numA + numB) === 0.3

关于JavaScript中计算精度丢失的问题

摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法. 关键词: 计算精度 四舍五入 四则运算 精度丢失 1. 疑惑 我们知道,几乎每种编程语言都提供了适合货币计算的类.例如C#提供了decimal,Java提供了BigDecim

【C语言】 计算任意2个日期之间的天数

[本文原创于Paul的博客园技术博客.] [本文欢迎转载,转载请以链接形式注明出处.] [本博客所有文章都经博主精心整理,请尊重我的劳动成果.] [C语言] 计算任意2个日期之间的天数 1. 要判断时间的合法性(如果不想判断也可以) 2. 判断两个日期之间的天数 判断输入的年份是不是闰年:年份是否相同:月份是否相同:日是否相同?同年同月最好计算,日数相减就出来了:同年不同月也好计算,计算中间相隔几个月,转换成天数,小的日期距月底有多少天,大的日期距月初多少天,三个数相加:关键是不同年的日期计算:

李洪强漫谈iOS开发[C语言-041]-计算月份天数

李洪强漫谈iOS开发[C语言-041]-计算月份天数 

java用double和float进行小数计算精度不准确

java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非常严重的. <Effective Java>中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,java的设计者给编程人员提供了一个很有用的类BigDecim

关于JS数学计算精度不准和自动转科学计数法的问题

在javaScript中,数学计算是一个很坑爹的问题, 由于系统二进制转十进制的误差,导致浮点数的运算精度很不理想,经常会出现一些意想不到的问题. 而js自动将小数转为科学计数法的问题,也让一些自己写数学插件的同学痛苦不已. 第一个,浮点数计算精度: 比如:1.2*3 = 3.599999999.... 解决办法: ⑴将浮点数乘以10的n次幂化为整数,再进行计算,之后再除以10的n次幂,就可以得到我们想要的数值.即:1.2*3 = 12*3/10 = 3.6;(n为小数点后数位之和); 至于多个

(Jquery)避免数据相加小数点后产生多位数和计算精度损失

/** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失. * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum1 = num1.toString().split(".")[1].length; } catch (e) { baseNum1 = 0; } try { baseNum2 = num2.toString

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩