【问题标题】:To power of gives sometimes wrong answer有时会给出错误的答案
【发布时间】:2021-08-07 18:33:34
【问题描述】:

每当我运行程序时,为x 输入 2 为y 输入 2 会得到 4,这很好,但每当我输入 2 的 3 次幂时,它会输出 9 什么时候应该输出 8 什么时候我做 3 到 2 的幂,它应该给 9 时输出 8。它适用于 2^2、2^4 但不适用于 2^3。 8^8 也给出256。程序写错了吗?

/ Start of the main program 
Input / Enter the exponent Store y
Subt One
Store Count

Input / Enter the Base
Store x
Store y
Jns Exp

/ Ending the main program
Load Ans 
Output 
End, Halt

Exp, Hex 0
Loop2, Load Count
    Skipcond 800
    JumpI Exp
    JnS Multiplier
    Load Ans
    Store x
    Load Count
    Subt One
    Store Count
    Jump Loop2

/ Start of the subroutine Multiplier
Multiplier, Hex 0
    Load Zero
    Store Ans
Loop, Load x
    Skipcond 800
    JumpI Multiplier
    Load Ans
    Add y
    Store Ans
    Load x
    Subt One
    Store x
    Jump Loop

/ Declaration
x, Dec 2
y, Dec 3
Zero, Dec 0
One, Dec 1 
Ans, Dec 0 
Count, Dec 0

【问题讨论】:

  • 您是否考虑过 2^4 == 4^2 并且您只是在计算 a^b 而不是 b^a?对于适合 32 位但不适合 16 位的 8^8,我无法想象溢出的来源——除非您返回的是高 16 位。

标签: assembly exponentiation marie


【解决方案1】:

你的论点倒过来了。 2**33**2 的结果只是倒退。 2**22**4 不受参数顺序的影响。

不可能用 16 位数字表示 8**8,因为那是 0x1000000,所以你总是会得到错误的结果。

您的代码先取指数,然后取底数。


我使用** 约定来表示指数而不是^,因为后者在大多数编程语言中用于表示异或。

【讨论】:

  • 但是为什么结果是倒退的呢?是代码有问题还是?
  • 结果并没有倒退。你给他们的顺序错误。第一个参数是指数,然后是基数。阅读您提供的代码,它首先要求指数。当您输入x**y 时,您首先输入y,然后输入x。这可以通过交换第一组输入和存储来改变(不是现在错了,只是不同)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2014-11-19
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多