【问题标题】:Return bit-level equivalent of expression -f for floating point argument f [closed]返回浮点参数 f 的表达式 -f 的位级等效项 [关闭]
【发布时间】:2012-09-17 20:54:13
【问题描述】:

这是一个家庭作业问题,我完全没有想法(C 编程)。

说明:

/* 
 * float_neg - Return bit-level equivalent of expression -f for
 *   floating point argument f.
 *   Both the argument and result are passed as unsigned int's, but
 *   they are to be interpreted as the bit-level representations of
 *   single-precision floating point values.
 *   When argument is NaN, return argument.
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
 *   Max ops: 10
 *   Rating: 2
 */
unsigned float_neg(unsigned uf) {

return 2;

我试过简单地返回 -uf;和其他事情,但我只是不知道该怎么做。

帮助?

可以假设以下条件:

  1. 使用 2s 补码,32 位整数表示。
  2. 以算术方式执行右移。
  3. 将整数移动更多时会出现不可预知的行为 大于字长。

-编辑

解决了:返回uf^0x80000000;

【问题讨论】:

  • 查看en.wikipedia.org/wiki/Single-precision_floating-point_format - 你需要翻转输入的最高位并返回结果,除非输入是NaN
  • 如果那条评论是你的老师写的,那肯定会令人困惑。
  • 值得注意的是,这个赋值定义的“否定”与 IEEE-754 标准相反,该标准规定否定应该翻转所有输入的编码符号位,包括 NaN(第 5.5.5 节)。 1 在 754-2008)。

标签: c floating-point negate


【解决方案1】:

暂时忽略问题的荒谬性,问题是询问浮点格式,大概是英特尔芯片使用的 IEEE-754 标准。 32bits的IEEE号的二进制格式为:-

因此,否定该值是微不足道的。在切换最高位之前,您必须检查各种特定值:Nan、Inf 等;这些在 IEEE 规范中有详细说明。

请注意,您可以有 +0 和 -0。

简单地返回整数否定是行不通的,因为它会执行 2 的补码否定,因此整数值 1 变为 0xffffffff,当被 FPU 解释时,这将是一个大不相同的值。

【讨论】:

  • 只检查 NaN 就足够了,对吧?其他一切都可以否定吗?
  • @harold:最好检查 IEEE 规范以确保哪些特殊值具有 + 和 - 值。
  • 所有这些,AFAIK。只是评论说 NaN 应该原封不动地返回,否则它们的符号也可能被改变。但我会再去检查一下。
  • @harold 是的,确实如此。无需检查 infs 和东西。
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多