22

私はプログラミングの授業を受けていて、このトリッキーな質問をされましたが、授業が終わるまで答えられませんでした。

質問:

without using the *任意の入力 (Float、int など) を 7、 operator in で乗算するにはどうすればよいですか TWO steps

誰かがこの質問の答えを説明付きで教えてくれれば、それは非常に役に立ちます.

TWO STEPS では、ループ (i=0;i<7;i++) を実行していると仮定します。その場合、ステップ数は >2 になり、TYPE CONVERSION、DIVISION、ADDITION など (Counts for steps ) になります。

4

8 に答える 8

4

C では、 IEEE 単精度浮動小数点形式で格納された浮動小数点数に対して次のハックが機能するはずです。

#include <stdint.h>

float mul7 (float x) {
    union {
        float f;
        uint32_t i;
    } u;
    u.f = x;
    u.i += (3 << 23);  /* increment exponent by 3 <=> multiply by 8 */
    return u.f - x;    /* 8*x - x == 7*x */
}

これは 2 つのステップ (1 つの整数の加算と 1 つの浮動小数点の減算) であり、何をステップとしてカウントするかによって異なります。C++ は多かれ少なかれ C と下位互換性があることを考えると、同様のトリックがそこでも可能であると私は信じています。

ただし、通常、このハックでは、サブノーマル、無限、または NaN 入力に対して正しい結果が得られないことに注意してください。また、8 を掛けるとオーバーフローするほどの大きさの入力に対しても、正しい結果が得られないことに注意してください。

float の代わりに double を使用するようにコードを調整することは、読者の課題として残されています。(ヒント: マジック ナンバーは 52 です。)

于 2013-04-22T20:15:10.413 に答える
1

整数に対して次のことを行うこともできます。

( x<< 3) - x
于 2013-04-22T11:00:24.367 に答える
0
// String num = "10";
// int num = 10;
float num = 10;

BigDecimal bigD = new BigDecimal(num);
BigDecimal seven = new BigDecimal(7);
System.out.println(seven.multiply(bigD));

BigDecimal& そのmultiplyメソッドを使用できます。ほとんどすべてに機能します。

于 2013-04-22T11:00:28.360 に答える