当前位置: 首页 > 知识库问答 >
问题:

分解浮点数

漆雕唯
2023-03-14

给定一个浮点数,我想把它分成几个部分,每个部分都有一个给定的位数。例如,给定3.1415926535并要求将其分成以10为基数的4位数部分,它将返回3.1415.926E-4 5.350E-8。实际上,我想把一个double(有52位精度)分成三部分,每个部分有18位精度,但是用一个base-10的例子来解释更容易。我不一定反对使用标准双精度IEEE浮点的内部表示的技巧,但我确实更喜欢纯粹停留在浮点领域的解决方案,以避免endian依赖或非标准浮点表示的任何问题。

不,这不是家庭作业问题,是的,这有实际用途。如果要确保浮点乘法是精确的,则需要确保所乘的任何两个数字的位数永远不会超过浮点类型中的一半。从这种分解开始,然后乘以所有部分并进行卷积,这是一种方法。是的,我也可以使用任意精度的浮点库,但是当只涉及几个部分时,这种方法可能会更快,而且肯定会更轻。

共有3个答案

谈旺
2023-03-14
匿名用户

您可以使用BitConzer。DoubleToInt64Bits和C#的按位运算符。您似乎很熟悉IEEE浮点格式,因此我将不再详细介绍。

我刚刚注意到标签C。在这种情况下,您可以使用联合并执行几乎相同的操作。

你面临的真正问题是:

  1. 处理隐式前导“1”。在边界情况下,这将导致0/-0情况。我可以预测,由于这个原因,您的代码将充满特殊情况

除了上面提到的,指数的处理应该很简单:第二和第三个18位部分减去18和36(然后找到前导的1,当然进一步减小它)。

丑陋的解决方案?IEEE754本身在边界情况下是丑陋的。Big-endian/little-endian是你最不需要的问题。

就我个人而言,我认为这对你最初的目标来说太复杂了。只要坚持一个简单的解决方案:找到一个计算尾随零的函数(标准本身定义了一个吗?我可能会与图书馆混淆)并确保总和是

希望这有帮助。

利稳
2023-03-14

分解数字的c方法是absfrexp,它们去除了符号和指数。结果必然是[0.5,1.0]。乘以1

段干德泽
2023-03-14

如果要确保浮点乘法是精确的,则需要确保所乘的任何两个数字的位数永远不会超过浮点类型中的一半。

正是。这种技术可以在Veltkamp/Dekker乘法中找到。虽然像在其他答案中一样访问表示的位是可能的,但您也可以只使用浮点运算。这篇博文中有一个实例。您感兴趣的部分是:

Input: f; coef is 1 + 2^N
 p = f * coef;
 q = f - p;
 h = p + q;  // h contains the 53-N highest bits of f
 l = f - h;  // l contains the N lowest bits of f

*-必须是精确到f的IEEE 754操作才能工作。在英特尔体系结构上,这些操作由SSE2指令集提供。VisualC在其编译的C程序的前奏中将历史FPU的精度设置为53位,这也很有帮助。

 类似资料:
  • 我编写了一个程序来演示Go中的浮点错误: 它打印: 这与用C编写的相同程序的行为相匹配(使用双代码类型) 但是,如果改用,程序就会陷入无限循环!如果将C程序修改为使用而不是,它将打印 为什么在使用时,Go程序的输出与C程序的输出不一样?

  • 3.2. 浮点数 Go语言提供了两种精度的浮点数,float32和float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8

  • 问题内容: 有点像这个问题,但是相反。 给定类似,或的字符串,将其转换为浮点数的最佳方法是什么?我正在考虑根据情况使用正则表达式,但是也许有人知道更好的方法或预先存在的解决方案。我希望可以使用,但是我认为第3种情况可以避免这种情况。 问题答案: 我稍微调整了詹姆斯的回答。 http://ideone.com/ItifKv

  • 在处理浮点数时,我对C#中“精度”的实际含义有些怀疑。如果逻辑性不强,而且解释太长,我提前道歉。 我知道浮点数(例如)的精度为6到9位。假设我们有下一个代码: 我在控制台里得到了确切的数字。现在,让我们使用下一个代码: 打印了一个不同的数字:,即使这个数字有9位数,这也是极限。 这是我的第一个怀疑。精度取决于数字本身还是计算机的结构? 此外,数据以位的形式存储在计算机中,在中间,我记得将数字的小数

  • 问题内容: 我很困惑为什么在这种情况下python为什么要添加一些额外的十进制数,请帮助解释 问题答案: 浮点数是一个近似值,它们不能精确存储十进制数。因为它们试图仅用64位表示很大范围的数字,所以它们必须在某种程度上近似。 意识到这一点非常重要,因为它会导致一些怪异的副作用。例如,你可能会非常合理认为,十批的总和会。尽管这似乎合乎逻辑,但在浮点数方面也是错误的: 您可能会认为。浮点世界再次不同意

  • 11.1.3 浮点数 在计算机中,浮点数一般由三部分组成:数值的符号位、阶码和有效数字(以后简称为尾数)。这种浮点数是用科学记数法来表示的,即:浮点数=符号位.有效数字×2阶码。 Intel系列的协处理器支持3种形式的浮点数:短型浮点数(32位)、长型浮点数(64位)和临时浮点数(80位),它们分别对应单精度、双精度和扩展精度浮点数。这些浮点数的数据格式都符合IEEE-754标准,它们的具体格式如