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

为什么在lua中乘法和除法有时不是相同的精度?例如下面的例子

在Lua中,乘法和除法有时不是相同的精度是因为Lua中的数字类型是双精度浮点数(64位浮点数),而不是精确的十进制数。由于浮点数的特性,它们无法精确地表示所有的十进制数。

在计算机中,浮点数的表示是基于二进制的,而十进制数则是基于十进制的。这导致了在进行浮点数计算时可能会出现舍入误差。

例如,考虑以下Lua代码片段:

代码语言:lua
复制
local a = 0.1
local b = 0.3

local c = a * b
local d = b / a

print(c) -- 输出结果为0.03
print(d) -- 输出结果为2.9999999999999996

在这个例子中,我们期望乘法的结果为0.03,除法的结果为3。然而,由于浮点数的舍入误差,乘法的结果实际上是0.03,而除法的结果是一个接近3的近似值。

这种舍入误差是由于浮点数的内部表示方式造成的,它会在计算过程中累积,并最终导致结果的不准确性。因此,在Lua中进行浮点数计算时,我们应该意识到可能会出现精度问题,并在需要精确计算的情况下采取适当的措施,例如使用整数运算或使用Lua的精确计算库。

在Lua中,可以使用math.floor函数对浮点数进行向下取整,以减少舍入误差的影响。例如:

代码语言:lua
复制
local a = 0.1
local b = 0.3

local c = math.floor(a * b * 100) / 100
local d = math.floor(b / a * 100) / 100

print(c) -- 输出结果为0.03
print(d) -- 输出结果为3

通过将乘法和除法的结果乘以一个较大的数(例如100),然后向下取整,我们可以获得更接近预期结果的精度。

总之,在Lua中,乘法和除法有时不是相同的精度是由于浮点数的舍入误差所致。为了避免精度问题,可以采取适当的措施,如使用整数运算或精确计算库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Lua连续教程之Lua字节

不过,由于我们可能需要处理使用无符号整型表示外部数据或实现一些需要64位整型数算法,因而有时也不能浪费这个符号位。因此,精简Lua,这种区别可能会很重要。...,即便x乘以2也会溢出,所以示例没有演示乘法 关系运算对于有符号整型数无符号整型数是不一样,当比较具有不同符号位整型数时就会出现问题。...我们也可以单纯使用选项s,在这种情况,字符串长度会被以足够容纳任何字符串长度size_t类型保存。 对于浮点型数,有3选项:f用于单精度浮点数、d用于双精度浮点数、n用于Lua语言浮点数。...格式字符串也有用来控制大小端模式二进制数据对齐选项。默认情况,格式使用是机器原生大小端模式。...可以使用如下命令调用该程序: lua prog.lua file.dos file.unix 再举一个例子,一程序输出了一个二进制文件所有字符: local f = assert(io.open

2.3K20

Go语言中常见100问题-#19 Not understanding floating points

精度浮点类型(float64),分别用11个52个bit位表示指数尾数,剩下1个bit位表示符合。可以用下面的计算公式将浮点数转为十进制数。...原本1.0001计算机存储实际值是1.000100016593933,所以缺少精度会影响存储值准确性。 通过上面的一个具体例子了解了浮点数计算机存储是近似值。...事实上,当执行操作涉及加法、减法、乘法除法时,先进行乘法除法运算,能够获得更好精度。...Go语言中float32float64计算机是一种近似值表示,因此,我们必须牢记下面的规则: 当比较两个浮点数时,检查它们差值是否可接受范围内,而不是直接 == 进行比较 当执行加法或减法时...,为了获得更好精度,可以根据运算级进行分组 为了提高准确性,如果一系列运算需要加法、减法、乘法除法,先执行乘法除法运算

70320
  • Nodejs学习笔记(十七)--- 浮点运算decimal.js

    前言  开发过程免不了有浮点运算,JavaScript浮点运算精度问题会带来一些困扰  JavaScript 只有一种数字类型 ( Number )  JavaScript采用 IEEE 754 标准双精度浮点...(64),64位 1位浮点数符号,11存储指数,52位存储浮点数有效数字  有时候小数二进制中表示是无限,所以从53位开始就会舍入(舍入规则是0舍1入),这样就造成了“浮点精度问题”(由于舍入规则有时大点...  示例: 0.029 / 10   预期结果:0.0029   实际结果:0.0029000000000000002 说明:以上加、减、乘、除示例分别演示了JavaScript运算结果(当然实际结果并不是我们想要...),为什么会出现这样结果,前言中已经说明^_^!...说明: “浮点问题”不算是问题,它一直就是这样,也不是JavaScript独有的, 所以这个锅不应该它背^_^!

    3.4K80

    漏洞连载|浮点与精度处理不当那些事儿

    构造函数owner权限既不可过于强大也不可落入他人之手。继承父类函数变量新声明子类函数变量有微妙差别,名字相同情况,调用父类函数操作会是父类变量。...然而,合约数学运算,其实不仅仅只有溢出问题,还有与精度密切相关除法运算以及浮点。...所以我们可以说,计算精度关键不在于它频率内存,而在于它是如何设计、表示、以及计算Solidity,浮点精度也存在类似的争议,本期我们就来探讨计算浮点产生精度漏洞。...在上面的例子,购买代币计算是msg.value/weiPerEth*tokenPerEth。请注意,这里除法发生在乘法之前。...如果计算首先进行乘法,然后再进行除法,那么这个例子会达到更高精度例如修改为msg.value*tokenPerEth/weiPerEth。

    1K10

    C语言高效编程与代码优化

    这是一个消耗很大操作,应该尽可能避免执行。有时,可以通过乘法表达式来替代除法例如,假如我们知道b是正数并且b*c是个整数,那么(a/b)>c可以改写为a>(c*b)。...合并除法取余数 一些场景,同时需要除法(x/y)取余数(x%y)操作。这种情况,编译器可以通过调用一次除法操作返回除法结果余数。...block-sie值设置为8仅仅适用于测试目的,只要我们重复执行“loop-contents”相同次数,都会有很好效果。在这个例子,循环条件每8次迭代才会被检查,而不是每次都进行检查。...先验函数,例如sin、explog是通过一系列乘法和加法实现(使用了精度扩展)。这些操作比通常乘法至少慢十倍。 简化浮点运算表达式。编译器并不能将应用于整型操作优化手段应用于浮点操作。...编译器可以一个文件中进行优化-避免将相关函数拆分到不同文件,如果将它们放在一起,编译器可以更好处理它们(例如可以使用inline)。 单精度函数比双精度更快。

    3.2K10

    【万字长文】C语言高效编程与代码优化,建议收藏!

    这是一个消耗很大操作,应该尽可能避免执行。有时,可以通过乘法表达式来替代除法例如,假如我们知道b是正数并且b*c是个整数,那么(a/b)>c可以改写为a>(c*b)。...合并除法取余数 一些场景,同时需要除法(x/y)取余数(x%y)操作。这种情况,编译器可以通过调用一次除法操作返回除法结果余数。...block-sie值设置为8仅仅适用于测试目的,只要我们重复执行“loop-contents”相同次数,都会有很好效果。在这个例子,循环条件每8次迭代才会被检查,而不是每次都进行检查。...先验函数,例如sin、explog是通过一系列乘法和加法实现(使用了精度扩展)。这些操作比通常乘法至少慢十倍。 简化浮点运算表达式。编译器并不能将应用于整型操作优化手段应用于浮点操作。...编译器可以一个文件中进行优化-避免将相关函数拆分到不同文件,如果将它们放在一起,编译器可以更好处理它们(例如可以使用inline)。 单精度函数比双精度更快。

    1.6K20

    Python数据类型之数字类型

    所以Python里 / 表示为浮点数除法,// 表示为整数除法 3. bool类型 4....所以Python里,10分别可以代表TrueFalse,至于为什么是10,这就是十进制问题了,有兴趣同学可以自行查阅,在这不再阐述 为了进一步说明为什么布尔值是数字类型,看下面代码: ?...bool()是python内置函数,根据括号里面的参数返回真或假 但是是不是只有10表示TrueFalse呢? ?...上面其实就是二进制代表10 下面再拓展一,并不是只有数字类型才能转成布尔类型。 用字符串来表示True或者False: ? 可见,只要是非空字符都表示为True。...这个也是False一个例子。 以上就是Python数据类型数字类型 。

    98520

    Lua连续教程之Lua数值

    同时,具有相同算术值整型值浮点值Lua语言中是相等: >1 == 1.0 --true >-3 == -3.0 --ture >0.2e3 == 200 --ture 少数情况...算术运算 除了加减乘除、取负数等常见算术运算外,Lua语言还支持取整除法、取模指数运算。 两个整数型值进行加减乘除取负操作结果仍然是整型值。...Lua表达式同意支持幂运算,使用符号^表示,像除法一样,幂运算操作数也永远是浮点类型(整型值幂运算时不能整除,例如,2^{-2}结果不是整型数)。...因此,数值表示范围精度上都是有限制。标准Lua使用64个比特位来存储整型值,其最大值为2^{63}-1,约等于10^{19};精简Lua使用32个比特位存储整型值,其最大值约为20亿。...例如,12.7 -20 + 7.3即便是用双精度表示也不是0,这是由于12.77.3二进制表示不是有限小数。

    4.2K20

    C++学习——数据类型(强制)转换详解

    在下面的表达式,假设 years 是一个 int 变量,而 interestRate 是一个 double 变量: years * interestRate 乘法发生之前,years 值将升级为... width 值是相同数据类型,所以它们都不会被转换为任何其他数据类型。...例如,来看下面的代码段。...而 number 值仍为 3.7,保持不变。 类型转换表达式 C++ 不能自动执行所需转换情况很有用。 下面的程序显示了使用类型强制转换表达式来防止发生整除法示例。...警告,为了防止发生整除法除法运算之前,其中一个操作数应该转换为一个 double 双精度值。这将强制 C++ 自动将其他操作数值也转换为双精度值。

    1.6K10

    16位汇编第六讲汇编指令详解第二讲

    ,还有流水线作用,上面的代码看着很恶心,可是真是的环境就是这样,不是教你怎么去写,而是教你怎么去看,让你明白他为什么这样写.当然流水线优化还有很多种.这里只是最简单一个例子        3.乘法指令...这里看一,除法指令周期很长,最低70-77,所以也可以优化 这里可以看出  al要放乘数  其余寄存器放乘数 例如   ax = bl * al(他是乘数,你给多少,都是和他相乘) 汇编例子 mov...*16 则放在 DX(数据寄存器)(AX累加寄存器)当中 高16位放到DX当中,低16位放到AX 其中乘法 操作数都需要我们自己给,比如 MUL bl, 算出bl乘法,默认会al相乘 乘法指令是利用...相同为假,不同为真,axax肯定各个二进制位相同,此时相同为0,则都变成0了) 面的一样,ax都是变为0,而我则赚了一个1个指令周期,其实还有很多这样汇编代码,都是这样做出来 所以说学习汇编,...但是除法除法优化原理,以后讲,这里掌握两个指令即可. 5.除法指令 除法指令也分为有符号除法,无符号除法   ax / r8,m8商,放到AL,余数放到AH   16位除法   ax /r16

    1.1K50

    Mysql 乘法除法精度不一致,除法后四位小数

    所以初步得知Mysql乘法除法对小数点后精度不一致 国内论坛没有找到合适资料,于是到国外论坛寻找,提问,交流。...除法精度默认是小数点后4位 乘法精度使用操作数精度方式来判断,如例子1*0.01 精度分别是小数点后0位2位,那么就是0+2 =2 结果也将使用2位精度 测试 select 1.00 *...@x@y就是除数被除数。 同时我还提出疑问,是否能在mysql里设置默认除法精度,我们就可以不用每次sql都使用函数计算了。...前辈回复:如果你不想有时候出现出乎意料情况,那么需要每次都强制使用类型转换。...除法精度规则 由上面引用文献可知:当使用两个数值进行计算时,结果精度由第一个操作数精度 + 系统变量div_precision_increment值决定,如我们例子1 精度是0,系统变量精度

    3.8K30

    数值信息机器级存储

    但是我们代码定义各种数值又是如何转换为二进制串存储在这些「字节」里面的呢?为什么两个整数相加之后结果会变成负数? 等等这些类似问题,其实都归咎于 计算机是如何存储各种类型数值。...对于乘法操作而言,大多数计算机都有自己乘法指令,只不过我们一般不用。原因就是乘法指令非常慢,耗时。而相对于比较快移位操作而言,编译器通常会将程序数值乘法操作优化为多次移位操作组合。...例如:x * 20 = x << 4 + x << 2 。 除法操作也是一个道理,只不过除法是右移。 对于除法来说,还存在一个舍入问题,就是说,-7/2 结果应该得到是 -3 而不是 -4。...下图是浮点数存储标准格式,当然单双精度各自模块使用位数不尽相同。...有人可能会好奇,为什么不直接存储 E 呢,而是选择加上一个 Bias 再存呢? 因为计算机进行加法运算时候,如果两个浮点数阶码不同,会首先统一一两者阶码,然后将他们尾数部分相加。

    1.3K60

    智能合约安全之算术精度问题

    运算符优先级 在这里,我们先简单了解一运算符优先级顺序(只讨论+、-、*、/、()): 同级概念 加、减、乘、除运算,加法、减法属于同一级别运算,乘法除法属于同一级别运算 同级运算 从左到右依次运算...,例如: d=a+b-c; 这里运算顺序为:先计算a与b,之后再用运算结果与c做差,然后将最终结果赋值给d。...算术精度安全问题 了解完上面Solidity特性以及算术运算优先级问题之后,我们下面来讨论一本期正题——算术精度安全问题。...首先,我们抛出一个问题:"进行乘法除法算术运算时,读者觉得应该如何合理安排运算次序?",很多人可能会哈哈一笑,这不是多此一举吗?之前不是定义了吗?...),所以建议进行数值运算时先进行乘法运算,后进行除法运算,某些情况也可以借助于()来改变优先级运算顺序。

    47230

    数值问题

    数值问题 计算机里面关于数值处理自有一套体系理论,与现实生活我们所习惯使用不太一样。如果对其不了解,使用计算机过程便可能发生一些意想不到错误。...今天本文就来简明地介绍计算机里面的数值方面的一些知识,并用具体例子来说明可能出现一些问题。 一些概念 机器数:数值计算机内部编码,也就是实际存储 0/1 序列。...但是负数就有问题了,向下舍入并不是向0舍入,需要校正。 为什么移位来实现除法是向下舍入呢,正数应该很好理解,右移之后丢掉移出小数部分,数值自然变小了。...乘除法 浮点数乘法运算过程类似加减法,主要区别在于乘除法不用対阶,其他过程基本一样。...本文很多地方例子就是采用她书上或者 PPT 例子

    19500

    超全 | 只有高手才知道C语言高效编程与代码优化方法(二)

    block-sie值设置为8仅仅适用于测试目的,只要我们重复执行“loop-contents”相同次数,都会有很好效果。 在这个例子,循环条件每8次迭代才会被检查,而不是每次都进行检查。...在编写浮点操作程序时,记住如下几点: 浮点除法很慢。浮点除法比加法或者乘法慢两倍。通过使用常量将除法转换为乘法例如,x=x/3.0可以替换为x=x*(1.0/3.0))。...常量除法在编译期间计算; 使用float代替double。Float类型变量消耗更好内存寄存器,并由于精度低而更加高效。如果精度够用,尽可能使用float; 避免使用先验函数。...先验函数,例如sin、explog是通过一系列乘法和加法实现(使用了精度扩展)。这些操作比通常乘法至少慢十倍; 简化浮点运算表达式。编译器并不能将应用于整型操作优化手段应用于浮点操作。...,如果将它们放在一起,编译器可以更好处理它们(例如可以使用inline); 单精度函数比双精度更快; 浮点乘法运算比浮点除法运算更快-使用val*0.5而不是val/2.0; 加法操作比乘法快-

    3.8K20

    智能合约审计之算术精度

    我们最常见运行操作,莫过于一四种: 加 减 乘 除 PS:这里暂不算“取余”操作,且Solidity同样不支持取余操作。...运算符优先级 在这里,我们先简单了解一运算符优先级顺序(只讨论+、-、*、/、()): 同级概念 加、减、乘、除运算,加法、减法属于同一级别运算,乘法除法属于同一级别运算 同级运算 从左到右依次运算...算术精度安全问题 了解完上面Solidity特性以及算术运算优先级问题之后,我们下面来讨论一本期正题——算术精度安全问题。...首先,我们抛出一个问题:"进行乘法除法算术运算时,读者觉得应该如何合理安排运算次序?",很多人可能会哈哈一笑,这不是多此一举吗?之前不是定义了吗?...),所以建议进行数值运算时先进行乘法运算,后进行除法运算,某些情况也可以借助于()来改变优先级运算顺序。

    90330

    C语言代码优化一些经验及小技巧(一)

    2、除法取余数 标准处理器,对于分子分母,一个32位除法需要使用20至140次循环操作。除法函数消耗时间包括一个常量时间加上每一位除法消耗时间。...这是一个消耗很大操作,应该尽可能避免执行。有时,可以通过乘法表达式来替代除法例如,假如我们知道b是正数并且bc是个整数,那么(a/b)>c可以改写为a>(cb)。...如果把参数名字起为str1str2,例如: void StringCopy(char*str1,char*str2); 那么我们很难搞清楚究竟是把str1拷贝到str2,还是刚好倒过来。...回顾上例,C标准库函数设计者为什么要将getchar声明为令人迷糊int类型呢? 正常情况,getchar的确返回单个字符。...为了区别于正常字符,只好将EOF定义为负数(通常为负1)。因此函数getchar就成了int类型。 我们实际工作,经常会碰到上述令人为难问题。为了避免出现误解,我们应该将正常值错误标志分开。

    1K32

    《夯实Python基础》(1)

    严格意义上讲,Python,数字并不是一种严格意义上对象类型,而是一组类似类型分类。...1、‍数字是一种常量 Python,数字被定义为一种常量,而且这个常量大小就是这个数字字面的大小,因此,也被称为字面常量。 例如:1,2,3,4,5 看见上面几个数字了吗?是的,没看见才怪。...是的,因为Python2版本除法运算,如果除数被除数都是整数时,结果仅取商整数部分,并自动剔除了余数。 那如果,我希望得到一个准确计算结果(含小数)呢?...对于乘法除法运算,Python还给出了两种特殊情况,** //。 这是啥意思?连乘连除? 不是的!应该说是乘方整除意思。...例如: >>> 2**3 >>> 8 它表示23次方,也可以说是3个2连乘,所以,结果等于8。这个比较好理解。 但是,如果我们除法使用//时,对于运算结果,有时就比较容易费解了。 先看例子

    41041

    Facebook新研究优化硬件浮点运算,强化AI模型运行速率

    定点数机制 我们可以设法避免尾数上进行乘法除法运算。尾数可以被看作是小数部分映射 f(x),它将取值范围在 [0, 1) 间定点数 x 映射到 [1, 2) 。...典型规格化浮点运算,f(x) 是仿射函数 1+x(我们称之为线性域数)。 当 f(x) = 2^x 时,我们可以使用对数数字系统(LNS)将乘法除法变成加法减法。...其思想不是浮点运算中进行累加,而是定点运算维护一个运行时(running sum),这个需要足够大以避免溢或溢出。...该转换使用了一个调整因子,它是累加器最多尾数位(在下面的例子是 6)有效指数。然后将对齐后尾数累加器与进位相加。...缓慢溢立刻防止了精度下降,而不是逐渐缓解精度下降,这在 IEEE 754 非规格化表示是通过尾数部分前导一位置解决

    1K30

    【游戏开发】小白学Lua——从Lua查找表元素过程看元表、元方法

    引言 在上篇博客,我们简单地学习了一Lua基本语法。其实在Lua中有一个还有一个叫元表概念,不得不着重地探讨一。元表实际地开发,也是会被极大程度地所使用到。...本篇博客,就让我们从Lua查找表元素过程,来探讨学习一Lua元表。 一、什么是元表 Lua table我们可以访问对应key来得到value值,但是却无法对两个table进行操作。...通俗来说,元表就像是一个“操作指南”,里面包含了一系列操作解决方案,例如__index方法就是定义了这个表索引失败情况该怎么办,__add方法就是告诉table相加时候应该怎么做。...下面是一些Lua可以重新定义元方法: __add(a, b) --加法 __sub(a, b) --减法 __mul(a, b) --乘法 __div(a, b) --除法 __mod(a, b)...结合上述几个小例子,我们再来解释一__index元方法含义:在上面的例子,当访问son.prop1时,son是没有prop1这个成员

    1.7K30
    领券