首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

热爱函数式你,句句纯正 Haskell【类型篇】

我们 wiki 上可以找到以下要点: Haskell 是一种标准化,通用纯函数式编程语言,有惰性求值和强静态类型; Haskell,“函数是第一类对象”。...Word 无符号整数,Haskell Word 相当于 C 语言里 unsigned int 类型; Integer 任意精度整数; Float 单精度浮点数; Double 精度浮点数; Rational...函数类型是本篇重中之重,前面的可以随意看看,但是从此节开始请务必细究。 函数可以理解为参数到结果一个映射,比如T1 -> T2。...我们在下一小节做更为细致说明“类型类”~ 类型别名 一个数据类型可以由多个其他类型组成, Haskell ,可以用 type 关键字将这些复杂类型替换成为其他简单名字; Prelude>...,以及类型类底下各种函数,真的太好用了吧~ 不用理会类型转换,特别是像 js 隐式转换,真的太爽了~ 逐渐学习过程,不断提升强类型设计精髓理解。

92330

JavaScript 浮点数之迷:0.1 + 0.2 为什么不等于 0.3?

带着这些疑问本文将重点梳理这背后原理及浮点数计算机存储机制。 通过本文你能学到什么? 浮点数先修知识,更好帮你理解本文知识 IEEE 754 标准是什么?...精确度浮点数下二进制数公式 V 演变如下所示: 指数 E E 为一个无符号整数,精度浮点数 E 为 11 位,取值范围为 ,即表示范围为 0 ~ 2047。...中间值: 由于科学计数法 E 是可以出现负数,IEEE 754 标准规定指数偏移值固定值为 ,以精度浮点数为例:,这个固定值也可以理解为中间值。同理单精度浮点数为 。...1 需进行舍入操作(二进制是以 0 结尾),舍入方法就是最低有效位上加 1,若为 0 则直接舍去,若为 1 继续加 1 100110011001100110011001100110011001100110011001100111...另外我们 0.1 与 0.2 相加做对阶、求和、舍入过程也会产生精度丢失。

3.7K31
您找到你想要的搜索结果了吗?
是的
没有找到

基础语法_Haskell笔记1

(a -> b) -> a -> b -- Defined in ‘GHC.Base’ infixr 0 $ 优先级最低中缀右结合函数,签名来看,只是个函数调用符,相当于右边加括号: --...,例如: > :t 2 2 :: Num t => t 或者更生动例子: -- 无参函数,就是const two = 1 + 1 匿名函数 匿名函数即函数表达式,Haskell称之为lambda。....匿名函数->与类型声明->语义相同,都表示“映射到”(maps to) 函数组合 数学函数组合表达方式是f·g(x) = f(g(x)),Haskell与之类似: fg = f . g...: 多行声明必须对齐缩进,否则编译器无法正确解析(不知道要定义变量/函数列表结束了没) 子句中声明变量和函数作用域是当前函数及其guard,且不包括同名函数其它模式 子句中可以用模式匹配 允许嵌套使用...length' xs = sum [ 1 | _ <- xs ] P.S.其中_表示占位符,不关心其值是什么,算一种地道编码习惯 另外,List Comprehension是可以嵌套: -- 滤掉二维数组奇数

1.8K30

15 张图带你深入理解浮点数

十进制 0.1,用二进制表示又是多少? 为什么 0.1 + 0.2 = 0.30000000000000004? 单精度精度浮点数有效小数位分别是多少? 单精度浮点数能表示范围是什么?...一般地,IEEE754 浮点数有两种类型:单精度浮点数(float)和精度浮点数(double),还有其他,不常用。单精度浮点数使用 4 字节表示;精度浮点数使用 8 字节表示。...(基数前文说了,固定是 2,因此不存) 尾数部分 前面提到过,浮点数名称由来在于小数点是浮动。但具体存储时,需要固定一种形式,这叫做尾数标准化。...IEEE754 规定,二进制数,通过移位,将小数点前面的值固定为 1。IEEE754 称这种形式浮点数为规范化浮点数(normal number)。...另外, Java 语言中也有类似的方法:Float.floatToIntBits(),你可以使用 Java 实现上面类似的功能。

2.3K32

IEEE 754二进制浮点数算术标准

ECMAScript Number 类型始终使用 64 位精度浮点数来表示数值。这一方面使得处理起来变得简单,另外一方面也限制了可以表示数值范围。...代码可以直接通过“NaN”方式来引用这个值。代码与数值相关计算结果也可能是 NaN。...单精度为8,精度为11。所以单精度固定偏移值是28-1 – 1 = 128 – 1 = 127,而精度固定偏移值是211-1 – 1 = 1024 – 1 = 1024。...单精度指数部分是-126 ~ +127,加上固定偏移值127,指数值大小1 ~ 254(0和255是特殊值)。浮点小数计算时,指数值减去固定偏移值将是实际指数大小。...第一个示例:263.3,先拆解一下:263.3 => 整数 263 + 小数0.3 正式开始推算前,先介绍三种十进制二进制三种方法:除基取余法、减权定位法、乘基取整法。

1.7K20

小浩发现这篇浮点数文章讲真不错!

十进制 0.1,用二进制表示又是多少? 为什么 0.1 + 0.2 = 0.30000000000000004? 单精度精度浮点数有效小数位分别是多少? 单精度浮点数能表示范围是什么?...一般地,IEEE754 浮点数有两种类型:单精度浮点数(float)和精度浮点数(double),还有其他,不常用。单精度浮点数使用 4 字节表示;精度浮点数使用 8 字节表示。...(基数前文说了,固定是 2,因此不存) 尾数部分 前面提到过,浮点数名称由来在于小数点是浮动。但具体存储时,需要固定一种形式,这叫做尾数标准化。...IEEE754 规定,二进制数,通过移位,将小数点前面的值固定为 1。IEEE754 称这种形式浮点数为规范化浮点数(normal number)。...另外, Java 语言中也有类似的方法:Float.floatToIntBits(),你可以使用 Java 实现上面类似的功能。

1.1K41

Java基础入门篇(三)——Java常量、变量

一、Java常量 (一)什么是常量 常量指的是程序中固定不变值,是不能改变数据。Java,常量包括整型常量、浮点型常量、布尔常量、字符常量等。...2.浮点型常量:数学中用到小数,分为精度浮点数(double)和单精度浮点数(float)两种类型。精度浮点数后面以D或d结尾,单精度浮点数后面以F或f结尾。...\n表示换行符,换到下一行开头。 \r表示回车符,使光标到当前行开头,不会跳到下一行。 \t表示制表符,相当于键盘Tab键。...,然而报错,所以需要转义符(\’) \表示反斜线,因为java代码斜杠是转义字符,所以需要表示字面意义上\,就需要使用斜杠。...2.二进制转换十进制 二进制转换十进制是右边到左边用二进制位上每个数去乘以2相应次方。 例如0110 0100换十进制,得到结果是100 ?

77931

Java 基础语法(2)- 基础数据类型

前言 直接搬别人笔记了,只做排版梳理,可能会加一点自己见解 Java数据类型 基础数据类型 引用类型:除了基础数据类型剩下都是引用类型 Java 几种基本数据类型是什么?...) 运算,不同类型数据先转换为同一类型,然后进行运算 强制类型转换,优先级 高 低 这个后面专门文章来讲解 ?...自动类型转换 由低到高直接输入,无需强制转换 转换注意 不能对布尔值进行转换 不能把对象类型转换为不相干类型 把高容量转换到低容量时候,需要强制转换 转换时候可能存在内存溢出,或者精度问题!...各自对应包装类是什么?...、精度精度浮点数(float)计算机存储器占用 4 个字节(32 bits),利用“浮点”(浮动小数点)方法,可以表示一个范围很大数值 比起单精度浮点数,精度浮点数(double)使用

43420

分析一次double强float翻车原因

, 重点是下面这条. float是单精度浮点数,double是精度浮点数....对于32位精度浮点数,最高1位是符号位s,接着8位是指数E,剩下23位为有效数字M。 对于64位精度浮点数,最高1位是符号位S,接着11位是指数E,剩下52位为有效数字M。...浮点数转成内存存储 为了避免产生上面那种画马跳跃,我们一小步一小步,看看浮点数据具体怎么在内存存储.精度与单精度类似,这里我以单精度为例. 先将这个实数绝对值化为二进制格式。...如果n是右移得到或n=0,则将n化为二进制后左边加“0”补足七位,再各位求反,再放入第29到第23位。 我们先用上述步骤尝试把9.0化成二进制存储形式....翻车分析 现在我们用上面的步骤,把照成翻车83459338成内存存储形式看看. 通过在线工具转换后证实我们转换完全正确. 然后我们再把数据转回来.

1.3K10

格物致知-Floating Point

比如在涉及精度必须准确货币类财务运算,要不更换单位*100为Integer,要不使用BigDecimal,稍微有点"经验"的人这里都不会敢用Float/Double。...然而, 浮点数只有有限几个比特准确度,所以最终我们可能期望t平方等于c,直至达到机器精度。 ? 对于某些值c,该方法"确实"是有效。 ? 这可能会让我们相信我们代码实现是正确。...实际应用,离散误差往往比舍入误差更重要。 统计误差 没有足够随机样本。 灾难性消除 当通过加法或减法数计算小数时,精确度损失很大。...通用诊断系统捕获了这个意外溢出,并将调试数据储到用于引导火箭发动机内存区域。控制权被切换到备份计算机上,但这台备机存储了一模一样数据。...传递性角度却不同:如果a和b是“相等”,b和c也是“相等”,却无法证明a和c一定是“相等”。 问:Java如何打印精度数? 答:通过将所有指数位设置为1。

2K20

Java匹马行天下之教你用学汉语式方法学编程语言

浮点型容器中装是小数,float和double也可以看成是容器容量,float叫单精度,double叫精度,理解同上。...两者主要区别如下:   1.在内存占有的字节数不同     单精度浮点数机内存占4个字节     精度浮点数机内存占8个字节   2.有效数字位数不同     单精度浮点数有效数字8位     ...精度浮点数有效数字16位   3.数值取值范围     单精度浮点数表示范围:-3.40E+38~3.40E+38     精度浮点数表示范围:-1.79E+308~-1.79E+308   4....程序处理速度不同     一般来说,CPU处理单精度浮点数速度比处理精度浮点数快 如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强   例如:float a=1.3...例:int X =10; 好,下面我们让计算机做一道加法题吧,我们现实生活写作业是笔记本上写吧,那电脑上写作业,你也得找个"笔记本",在编程语言中这个“笔记本”叫编译器,然后你看你笔记本上有画像四线三格那样各种线

49420

浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

Javascript才会出现,任何使用二进制浮点数编程语言都会有这个问题,只不过 C++/C#/Java 这些语言中已经封装好了方法来避免精度问题,而 JavaScript 是一门弱类型语言,...) IEEE-745浮点数表示法存储结构 IEEE754 精度浮点数采用 64 位存储,即 8 个字节表示一个浮点数 。...其存储结构如下图所示: 指数位可以通过下面的方法转换为使用指数值: IEEE-745浮点数表示法记录数值范围 存储结构可以看出, 指数部分长度是11个二进制,即指数部分能表示最大值是 2047...因此,表示精度位数前面,还存在一个 “隐藏位” ,固定为 1 ,但它不保存在 64 位浮点数之中。...因此,表示精度位数前面,还存在一个 “隐藏位” ,固定为 1 ,但它不保存在 64 位浮点数之中。

2.8K30

浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

才会出现,任何使用二进制浮点数编程语言都会有这个问题,只不过 C++/C#/Java 这些语言中已经封装好了方法来避免精度问题,而 JavaScript是一门弱类型语言,设计思想上就没有对浮点数有个严格数据类型...浮点数丢失产生原因 JavaScript数字类型只有 Number 一种,Number 类型采用 IEEE754 标准精度浮点数” 来表示一个数字,不区分整数和浮点数 (js位运算或许是为了提升...) IEEE-745浮点数表示法存储结构 IEEE754 精度浮点数采用 64 位存储,即 8 个字节表示一个浮点数 。...因此,表示精度位数前面,还存在一个 “隐藏位” ,固定为 1 ,但它不保存在 64 位浮点数之中。...因此,表示精度位数前面,还存在一个 “隐藏位” ,固定为 1 ,但它不保存在 64 位浮点数之中。

2.7K20

聊聊计算机数字表示方法(下)

本文浮点数原理出发,聊聊浮点数精度问题,对网上一些结论进行回答。 正文 正式开讲之前,我们必须先同步几个概念: 移码 同原码、反码、补码一样,移码也是一种数字编码方式。...定点数 我们知道计算机只能记录0和1,是无法记录小数点,那么4位计算机我们如何存储和计算二进制数1和0.1呢?...浮点数分为单精度精度,其存储结构如下图(平板手绘草图,凑合看…..): 以32位单精度浮点数为例: 1:符号位:占1位,用0表示正数,1表示负数; 2:尾数位:占23位,根据浮点数标准,浮点数整数部分一定为...导致浮点数丢失精度原因有很多,这里举两个例子: 1)10进制小数二进制小数 我们知道10进制小数二进制小数方法是乘以2取整数,假设计算机可以存4位尾数。...为什么说浮点数精度是6位 这里这样说不精确,正确说法是32位单精度浮点数有6位有效数字,百度会发现网上很多地方说为6位原因是尾数占23位,2^23=8388608,可以完全覆盖6位数,这个理由是错误

1.2K40

SpringBoot返回前端Long型丢失精度咋办

, 虽然精度浮点型范围看上去很大: 。...,也就是说(-2^{53}, 2^{53})范围内,精度数表示和整数是一对一,在这个范围以内,所有的整数都有唯一浮点数表示,这叫做安全整数。...和其他编程语言(如 C 和 Java)不同,JavaScript 不区分整数值和浮点数值,所有数字 JavaScript 均用浮点数值表示,所以进行数字运算时候要特别注意精度缺失问题。...我们这个场景里不需要进行运算,且Java进行JSON处理时候是能够正确处理long型,所以只需要将数字转化成字符串就可以了。...Spring boot处理方法基本上有以下几种: 一、配置参数 Jackson有个配置参数WRITE_NUMBERS_AS_STRINGS,可以强制将所有数字全部转成字符串输出。

3.8K21

0.57 * 100 === 56.99999999999999 之谜

JS, 无论整数还是小数都是Number类型, 它实现遵循IEEE 754, 是标准Double精度浮点数, 使用固定64位来表示。 看到这里你可能就不想看下去了。...实际上, JS数字都会转化为二进制存储下来, 由于数字存储限定了64位, 但现实世界, 数字是无穷, 所以一定会有数字超出这个存储范围。超出这个范围数字存储时就会丢失精度。...但我们可能不知道是, 小数十进制转化为二进制计算方法是, 小数部分*2, 取整数部分, 直至小数部分为0, 如果永远不为零, 超过精度最后一位时0舍入1。...阅读完上面一节, 对小数乘法我们也可以有一些自己猜测了。 0.57这个数值存储时, 本身精度不是很准确, 我们用toPrecision这个方法可以获取小数精度。..., 这个是真的丢失啦, 二进制十进制时, 结果就是56.99999...了 同理, (0.57 * 1000)也不是简单乘, 也是累加起来, 只是最后精度丢失时舍0进1, 结果就是570而已。

1.3K10

Java DoubleBigdecimal丢失精度原因学习

记录学习DoubleBigdecimal丢失精度原因 注意事项: 不能直接使用Bigdecimal构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制Double无法精确储存一些小数位...这是为什么呢,以往只是知道结论知道不能这么用,也大概知道是因为double是精度导致,但是没有太关注原因。...这次就来进一步学习一下 首先给出DoubleBIgdecimal常用方式 1、可以手动先将Double转换为String再转换为Bigdecimal 则不会发生精度丢失问题 BigDecimal...网上在线转换工具也很多,这里不详细介绍了 第二个要知道Double数据格式,Double是精度,Float是单精度。 Double与Float数据格式是一致,但是长度不同。...我们还是以0.1为例 先将0.1换为二进制,方法我们不详细介绍,0.1计算大致可以乘以2取整直到结果为0 0.1 * 2 = 0.2 小数位继续计算 二进制取整数位: 0 0.2 * 2 = 0.4

3K30

你以为用了BigDecimal后,计算结果就一定精确了?

十进制小数转成二进制,一般采用"乘2取整,顺序排列"方法,如0.625成二进制表示为0.101。...Java,使用float和double分别用来表示单精度浮点数和精度浮点数。 所谓精度不同,可以简单理解为保留有效位数不同。采用保留有效位数方式近似的表示小数。...那么标度到底是什么呢? 除了scale这个字段,BigDecimal还提供了scale()方法,用来返回这个BigDecimal标度。...所以,人们采用了一种通过近似值方式计算机中表示,于是就有了单精度浮点数和精度浮点数等。...所以,作为单精度浮点数float和精度浮点数double,表示小数时候只是近似值,并不是真实值。

85920

什么是定点数?

现实生活,我们经常使用整数和小数,不知道你有没有思考过,这些数字计算机是如何存储? 我们学习计算机知识时,经常听到「定点数」和「浮点数」,它们之间有什么区别?...于是人们想出一种方法,即约定计算机中小数点位置,且这个位置固定不变,小数点前、后数字,分别用二进制表示,然后组合起来就可以把这个数字计算机存储起来,这种表示方式叫做「定点」表示法,用这种方法表示数字叫做...对于前两种情况,纯整数和纯小数,因为小数点固定在最低位和最高位,所以它们用定点数表示时,原理是相同,只需要把整数部分、小数部分,按照十进制二进制规则,分别转换即可。...这里再总结一下这个过程: 在有限 bit 宽度下,先约定小数点位置 整数部分和小数部分,分别转换为二进制表示 两部分二进制组合起来,即是结果 计算机,用定点数表示一个数字方法,是不是很简单?...用定点数表示小数时,数值范围和小数精度是有限 现代计算机,定点数通常用来表示整数,对于高精度小数,通常用浮点数表示

2.2K10
领券