Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 253|回复: 4

[命令] [1.14.x基础模块]大数运算-数组存数——在MC里算XXX(支持高精度浮点数)

[复制链接]
lirui11 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
400
钻石
性别
保密
注册时间
2017-4-2
查看详细资料
 楼主| 发表于 2019-8-18 16:46:54 | 显示全部楼层 |阅读模式
"原版模组"
中文名称: 大数运算
英文名称: Big Numbers’ Operation
是否有配套资源包:
语言支持: 无文字显示/通用文字 
原版模组版本:
适用版本: 1.14.X 
下载地址: https://www.mcbbs.net/thread-904284-1-1.html
与多人游戏兼容性: 完全兼容
原版模组类型: 基础功能 辅助 前置

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 lirui11 于 2019-8-18 17:06 编辑

前言
在MC里进行运算时,有时计分板位数太少容易溢出,或者单纯只是想在MC里算点什么却发现精度不够。针对以上问题,我制作了这套数据包,理论上能够将任意位数的数进行运算。


加载数据包后,请输入
  1. /function num:init
复制代码
来初始化这个数据包
如何定义一个数
既然计分板的位数不够,我们就想到将每一位数存入数组中来表示一个数字。
在这个数据包里,数字以物品的形式存在,任何一个带有自定义标签num:{}的物品就是一个数,甚至一个普通的物品都可以表示 0 这个数。num标签结构如下:{num:{sign:,a:[],b:[]}}
其中,sign存储这个数的正负号,sign:- 表示这是个负数,sign:+ 表示这是个正数并且你希望这个数在显示的时候将+号一起显示出来。如果没有sign标签,默认为正数。
a:[]存储这个数的整数部分,将每一位从最高位依次写进数组里,如a:[1,2,3]表示整数部分是123。如果没有a标签或者a中没有元素,默认为0。
b:[]存储这个数的小数部分,将每一位从最高位依次写进数组里,如b:[4,5,6]表示小数部分是456。如果没有b标签或者b中没有元素,默认为0。
*所以,num:{a:[1,2,3]}表示数字123,num:{b:[4,5,6]}表示数字0.456
例子:
num:{sign:-,a:[1,2,3],b:[4,5,6]} ---> -123.456
num:{sign:+,a:[1,2,3],b:[4,5,6]} --->+123.456
num:{a:[1,2,3],b:[4,5,6]}           --->123.456
num:{sign:-,b:[4,5,6]}               --->-0.456
num:{}                                     --->0
  1. give @s stone{num:{sign:-,a:[1,2,3],b:[4,5,6]}}
复制代码


函数介绍
下列函数中被折叠的函数表示这个函数并不是正常的进行运算,仅进行绝对值的运算,主要用于开发新函数

function num:get

玩家执行后,将会把手持物品表示的数字tellraw输出给自己,若没有手持物品,输出0
QQ图片20190818124854.png


function num:get/block

执行后,将会把执行点处容器内第一个物品表示的数字tellraw输出给最近的玩家,输出效果同function num:get,若执行点处没有容器,或容器内没有物品,输出0
QQ图片20190818125533.png


function num:add

执行后,将会把执行点处容器内前两个物品表示的数字相加,并将结果输出到第一个物品,同时删除第二个物品,会正确处理正负号


function num:minus

执行后,将会用执行点处容器内第一个物品表示的数字减去第二个物品的,并将结果输出到第一个物品,同时删除第二个物品,会正确处理正负号



function num:times

执行后,将会把执行点处容器内前两个物品表示的数字相乘,并将结果输出到第一个物品,同时删除第二个物品,会正确处理正负号



function num:divided
  1. scoreboard players set #division_prec temp <要保留的小数位数>
复制代码

需要设置要保留的小数位数(存储在#division_prec的temp计分板上),这个设置是全局性的,某次设置后不用再次设置(除非需要更改)。接下来的除法运算都会保留指定的几位小数。
默认#division_prec的值为16。这个值必须大于等于0 可以大于16
如:scoreboard players set #division_prec temp 5 接下来的所有除法运算都会保留5位小数(按照四舍五入)如果哪次需要更高精度了,再重新设置

执行后,将会把执行点处容器内第一个物品作为被除数,第二个物品作为除数进行除法运算,并且保留#division_prec位小数,将结果输出到第一个物品,同时删除第二个物品。会正确处理正负号

*除数不能是0,否则将会陷入死循环,直到maxCommandChainLength
*遇到这种情况后请fill ~ 255 ~ ~ 250 ~ air将临时处理用的容器删掉
*除法的算法不是最高效的,如果愿意,可以将除法转化为乘法,例如除以3换成乘0.33333333,除以2换成乘0.5



function num:is_smaller


执行后,将会比较执行点处容器内前两个物品表示数字的大小,并将结果输出到#is_smaller的temp计分板上。会考虑正负号
如果第一个>第二个 输出0
如果第一个<第二个 输出1
如果第一个=第二个 输出2



function num:exchange

执行后,将会把执行点处容器内前两个物品表示的数字互换,此举不会把物品的id,数量等互换,只互换num标签



function num:import/score

需要事先给#score的temp计分板赋值,若不赋值则会使用当前#score的分数
执行后,将会把#score的temp分数转化成一位一位的数组,并把结果输出到~ 250 ~ Items[0].tag.push
例如,#score的分数是16380,执行函数后~ 250 ~的容器内第一个物品的tag就会有自定义标签push:[1,6,3,8,0]
然后使用data modify … from block ~ 250 ~ Items[0].tag.push来将数组导出
不要忘记setblock ~ 250 ~ air





注意
如果位数过多,计算所需命令也会很多,请适当调大/gamerule maxCommandChainLength [value]
如果不小心触及到了这个限制,请输入/fill ~ 255 ~ ~ 250 ~ air来删除计算过程临时的容器
所以,最好也不要在y轴250~255的地方使用函数(目前只有255和250会有临时容器出现,中间的位置先预留出来)


我能用这个数据包做什么
进行高精度运算,实现原先看起来不可能的事情 在MC里算XXX!
如果是用于命令层面,实用性到不是很大,因为将大数反过来输出到nbt上不是很容易,即使已经表示出123.456789456789456,把它输出为浮点数并不容易,几乎也是不可能的,这样看来又似乎没什么用了。不过一个东西刚出来的时候,谁知道会有什么用呢?

下载地址
big_num.zip (20.22 KB, 下载次数: 4)

评分

参与人数 4人气 +7 金粒 +25 收起 理由
隐退 + 2 MCBBS有你更精彩~
⊙u⊙ + 1 好评,但那么精又有何用。还难用....
setnightmare + 1 神乎其技,不服不行!
brooke_zb + 3 + 25 神乎其技,不服不行!

查看全部评分

brooke_zb 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
8930
钻石
性别
保密
注册时间
2015-3-27
查看详细资料
发表于 2019-8-18 17:52:14 | 显示全部楼层
这让我想起了java里的大整数,大浮点数,也是能实现任意精度的运算,果然MC是万能的啊
回复

使用道具 举报

隐退 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
2225
钻石
性别
保密
注册时间
2017-8-25
查看详细资料
发表于 2019-8-18 21:11:12 来自手机 | 显示全部楼层
本帖最后由 Teenager_Yang 于 2019-8-18 21:13 编辑

看到这个标题,我想起了我曾经的一个想法。
我当初的计划是让玩家将数字分成几部分存入记分板,最后的结果也是分成几部分输出(使用 tellraw 进行拼接)。利用算法实现进位和退位。
后来觉得没什么用,就弃坑了。

评分

参与人数 1人气 +1 收起 理由
lirui11 + 1 MCBBS有你更精彩~

查看全部评分

回复

使用道具 举报

Ruainbow_ 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
259
钻石
性别
保密
注册时间
2018-9-16
查看详细资料
发表于 2019-8-19 09:29:08 来自手机 | 显示全部楼层
如果能自带一个获取记分板每位上的数字然后按倍率储存为整数和小数的模块就好了。
回复

使用道具 举报

lirui11 当前离线
帖子
主题
精华
贡献
最后登录
1970-1-1
爱心
积分
400
钻石
性别
保密
注册时间
2017-4-2
查看详细资料
 楼主| 发表于 2019-8-19 10:42:04 来自手机 | 显示全部楼层
Ruainbow_ 发表于 2019-8-19 09:29
如果能自带一个获取记分板每位上的数字然后按倍率储存为整数和小数的模块就好了。 ...

这个可以调用num:import/score模块,倍率的话就调用乘法模块吧
主要是我觉得指定倍率通过给出num标签不方便(或者哪位dalao有方便的指定方法,我一定改),而且具体要把结果输出到哪里也不确定,所以这个import/score模块接口不是很好(跑
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 京公网安备 11010502037624号 | 手机版

GMT+8, 2019-9-20 03:22 , Processed in 0.036656 second(s), Total 13, Slave 12 queries , Gzip On, MemCached On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标 本站与Mojang以及微软公司没有从属关系

© 2010-2019 我的世界中文论坛 版权所有 本站原创图文内容版权属于原创作者,未经许可不得转载

快速回复 返回顶部 返回列表