如何在 SAS 中精确地添加两个大数?

Posted

技术标签:

【中文标题】如何在 SAS 中精确地添加两个大数?【英文标题】:How to add two large numbers in SAS with precision? 【发布时间】:2022-01-16 15:40:27 【问题描述】:

假设我有两个大数:5E31 和 8E34。有没有一种简单的方法可以在 SAS 中添加这些数字?我知道这些数字对于 SAS 来说可能太大了,但有什么捷径可走吗?

【问题讨论】:

我只知道在datastep中使用java对象添加它们的复杂方法 【参考方案1】:

您当然可以将这两个数字相加; SAS 可以存储超过 8e34 的数字。但是,您不能存储所有 34 位数字; SAS 使用 IEEE 754 双精度浮点数(在 Windows/Linux 上)并且可以精确存储多达几乎十六位数字(绝对精确到 15 位数字)。

请参阅Numerical Accuracy in SAS,详细了解 SAS 如何存储数字。另请参阅CONSTANT function documentation,它展示了如何获取一些值,例如系统上可存储的最大精确整数。

如果您确实需要这么高的精度,则需要使用另一种语言(例如,SAS 可以在某些版本中调用 Python 或 R,具体取决于您获得的许可),或者您需要实现自己的计算引擎,基于字符串或将数字分成两部分。 DS2 也有一些选项,但它们不能存储在 SAS 数据集中,因此它们只能在内部或数据库/等中使用。理解更精确数据类型的系统。

【讨论】:

大数字非常接近,例如-4.439319E31 + 4.4393187E31,但有时我将它们相加得到0,或者有时我得到非常大的数字,例如1E15,即使原始数字是量级相似。我希望这些数字的总和在 1000 以内,因为原始数字非常接近。 在进行数学运算时,您需要使用ROUND,就像上面文章中提到的 SAS 一样 - 特别是,将 * 舍入到最接近的 1e16。由于1e16 之后的所有数字都不重要,因此您需要丢弃它们。 我尝试了四舍五入,但数字的总和似乎仍然没有意义。我知道数字非常接近,但它们在 E31 中。因此,即使在四舍五入时,我也会在添加 1E15 时得到无意义的答案。就像说 100 + -999 = 100000 但我们知道它的 1。 发布一个新问题,其中包含示例数据和代码以及您得到的内容没有意义。那么有人会很容易提供帮助! 好的,那就去吧

以上是关于如何在 SAS 中精确地添加两个大数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C/C++ 中获得大数的精确二进制表示?

如何有条件地 %include 一个定义宏的 *.sas 文件?

如何在 SAS 中获取一个数据集并将其拆分为两个

iOS:Swift - 如何在触摸地图上添加精确定位并获取该位置的详细地址?

如何计算大数之间除法的第一个十进制数字?

/和//的区别(python)