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

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

【问题讨论】:

  • 我只知道在datastep中使用java对象添加它们的复杂方法

标签: sas


【解决方案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。
  • 发布一个新问题,其中包含示例数据和代码以及您得到的内容没有意义。那么有人会很容易提供帮助!
  • 好的,那就去吧
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多