C如何将两个浮点数相乘? [关闭]

Posted

技术标签:

【中文标题】C如何将两个浮点数相乘? [关闭]【英文标题】:How does C multiply two float numbers? [closed] 【发布时间】:2022-01-04 01:22:33 【问题描述】:

如果我们有两个整数,例如 5 和 6,我们可以这样做

for(int i = 0; i < 5; i++)
   number += 6;

那是一样的

number = 5*6;

但是,它是如何处理浮点数的?我在很多论坛上搜索,都找不到答案。有人知道 C 是如何让两个浮点数相乘的吗?

【问题讨论】:

我不知道任何没有乘法指令的硬件架构,那为什么C编译器要把乘法变成循环呢? 即使它没有乘法指令(简单的旧 CPU),您也不会乘以加法循环而是通过位移。但是您不必担心,用 C 编写代码会为您完成。 要求编译器输出汇编指令。这可能有助于您理解。 很确定没有乘法指令的架构不会有硬件浮点支持。因此它将在软件中进行仿真。有一些方法可以仅使用整数算术来执行幸灾乐祸点计算,当你用纸笔进行“长”乘法或除法时,你正在做这些。 @DiegoReis,这里违反惯例修改问题标题以表明问题已得到您满意的回答。相反,您的选择包括单击您的答案之一旁边的复选标记并且什么都不做。在某些情况下(但不是目前的情况),您也可以删除您的问题。 【参考方案1】:

如今,浮点运算在ALU 的指令库中作为单个指令执行,无需软件实现。

不管怎样,你可以很容易想象浮点乘法是由

将尾数相乘,视为具有适当缩放比例的整数;

添加指数;

组合符号。

需要对特殊数字(例如零)进行额外的管理。

【讨论】:

有道理!我完全忘记了 ALU 和电路中的二进制表达式。非常感谢,伙计们! @DiegoReis:如果答案解决了您的问题,那么您可能需要考虑接受答案。有关更多信息,请参阅此官方帮助页面:What should I do when someone answers my question? 请不要编辑问题标题以将其标记为已解决,因为这样做的正确方法是接受答案。系统将自动以不同的方式显示带有已接受答案的问题。【参考方案2】:

C 如何将两个数相乘?

首先,编译器会判断是否涉及到一个常量,所以它可能会做一个移位或移位和加法。

如果没有常量或常量太大,并且处理器没有乘法指令且没有乘法硬件,那么 C 编译器将使用库例程来完成这项工作。有时这些库例程称为内在函数或助手。这些是用汇编手工编写的以提高性能,编译器将知道是否使用了非标准调用约定。在这种情况下,非标准约定可以提高效率,例如知道某些其他暂存寄存器将被保留。

如果没有浮点指令和浮点硬件,浮点的工作方式相同:为提高性能而用汇编手工编写的特殊库例程,可能带有非标准调用约定。

如果指令集中有指令,但没有针对它们的硬件实现(这种情况发生在低端处理器上,而高端同级处理器确实有硬件),那么这些指令将产生硬件异常,这将允许软件根据需要模拟指令和寄存器。通常,这比预先知道硬件没有这些操作效率低——最好调用库函数,但是这种通过异常进行模拟的方法允许执行期望指令的“正常”代码并注册。

【讨论】:

以上是关于C如何将两个浮点数相乘? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何把浮点数转换成字符串?

在C语言中,如何将一个浮点数变换成整数?

Python将包含科学值和浮点值的熊猫数据框与浮点数相乘

js中如何判断两个浮点数是不是相等

js浮点数的加减乘除解决方案

大浮点数相乘