问题描述
我想将数据(双精度,15 个小数点)转换为另一种类型的数据(四倍精度,34 个小数点)。所以,我像这样使用了 schedule.scheduleJob('0 0 */1 * * *',async () => {
console.log("running every minute")
});
函数:
vpa
但是,结果的类型是data = sin(2*pi*frequency*time);
quad_data = vpa(data,34);
,而不是sym
。当我检查 double
类型数据的每个单元格时,在每个单元格中都创建了 sym
。我尝试使用“quad_data”来使用 1x1 sym
函数,但没有用。有什么办法可以把double类型的小数点从15改为34吗?
解决方法
MATLAB 当前唯一支持的数字浮点类型是 double、single 和 half。扩展精度类型可以通过 Symbolix 工具箱(例如 vpa)或第 3 方代码(例如,John D'Errico 的 FEX 提交高精度浮动 HPF 类)实现。但即便如此,通常也只会支持一部分浮点函数。如果您尝试使用的函数不支持变量类型,则您必须提供自己的函数。
此外,您一开始就没有正确构建 vpa 对象。通常,您会先将操作数转换为 vpa,然后对它们进行算术运算。像处理数据一样首先以双精度进行算术运算,然后转换为扩展精度 vpa,只会向值添加垃圾。例如,先设置数字,然后使用 vpa('pi') 将 pi 的完整扩展精度版本作为 vpa 变量。
,有一个用于此目的的商业 3rd方工具箱,称为Multiprecision Computing Toolbox for MATLAB。
此工具实现了您对 O(N^2)
输入所期望的许多数学运算,并且根据网站上的基准测试,它比 vpa 快得多。
披露:我与此工具的创建者没有任何关系,但是我可以说我们在我们实验室的一个项目中使用此工具有很好的经验。
我可以给出的另一个建议是在另一种语言\环境中进行高精度算术,MATLAB 为其提供接口(例如,C、python、java),并且应该实现 quad 数据类型。