【问题标题】:How to do floating conversions in scheme (drracket)?如何在方案(drracket)中进行浮动转换?
【发布时间】:2020-09-02 09:05:24
【问题描述】:

我想在方案语言中进行一些 bin 到 hex 、 hex 到 bin 、 hex 到 dec 等的转换。但我不习惯像高级用户那样玩闹。我需要将 3x4 实现为所有可能的二进制、十六进制、八进制和十进制对。

到目前为止,我只完成了 bin to dec 的实现,但我没有处理其他人的想法,谁能给我一些提示、想法或代码块以及各种有助于改进我的实现?

我把我的垃圾箱放在下面,提前谢谢大家。

(define (bin-to-dec x)
  (if (zero? x)
      x
      (+ (modulo x 10) (* 2 (bin->dec (quotient x 10))))))

祝你有美好的一天,注意安全。

【问题讨论】:

  • 内置 Racket number->string 程序有什么问题?例如。 (number->string #b11111 16) ==> "1f".
  • 数字是数字,它们没有底。看起来您对该函数的输入是一个在十进制系统中只有 1 和 0 的数字,但这不是二进制数。
  • 我想实现高阶程序。我怎样才能将这些作为更高的顺序? @molbdnilo

标签: binary hex scheme racket octal


【解决方案1】:

Racket 有内置程序来处理这类事情。 number->string 将接受一个数字并以指定的基数返回一个字符串表示形式。如果输入可以以数字文字的形式给出,您可以执行以下操作:

(number->string #b11111 16)  ==>  "1f"

如果目标是在字符串表示之间进行转换,上面可以结合内置的string->number,例如:

(define (nstring->nstring nstring radix-in radix-out)
  (number->string (string->number nstring radix-in) radix-out))
scratch.rkt> (nstring->nstring "11111" 2 16)
"1f"
scratch.rkt> (nstring->nstring "31" 10 2)
"11111"
scratch.rkt> (nstring->nstring "1f" 16 10)
"31"

【讨论】:

  • 我可以将它们全部定义为 12 块并将这个“数字->字符串”函数放入其中吗?所以,我可以打电话给他们每个人来转换我想要的特别喜欢的东西 (define ((bintodec n) 10) ((number->string n)10))
【解决方案2】:

第二个你在Scheme中有一个fixnum(整数),基数并不重要,因为数字没有基数。原因是 base 与数字的视觉编码有关。例如。 10 可以写成 #b1010 #xa #o12 并且所有这些都将在 Scheme repl 中显示 10 因为 repl 以十进制显示数字表示:

#b1010 ; ==> 10
#xa    ; ==> 10
#o12   ; ==> 10

如果您想打印不同基数的数字,您可以在数字从数字变为可视化表示(例如字符串)时执行此操作。 Scheme 有这个 number->string

(number->string 10 2)  ; ==> "1010"
(number->string 10 16) ; ==> "a"
(number->string 10 8)  ; ==> "12"

还有string->int 做相反的事情:

(string->number "1010" 2) ; ==> 10
(string->number "a" 16)   ; ==> 10
(string->number "12" 8)   ; ==> 10

您的实现bin->dec 将任意基数作为输入,并将其十进制可视化转换为二进制到十进制。例如

(bin-to-dec #b1010) ; ==> 2

【讨论】:

  • 所以,这些都是对浮点数转换的正确使用。我可以获得其中 4x3 部分组合的所有输入吗? bintodec、bintohex、bintooctal 和其他的等等?
  • 基本上你想从字符串转换为更大的然后再转换回字符串。您可以链接示例以使其正常工作。
  • 这是高阶程序吗?如果不是,我怎么能这样使用它?
  • @PensarNada 高阶程序只是喜欢将程序作为参数或评估为一个的程序。是的,您可以创建一个make-base-converter,它采用预期的输入基数和想要的输出基数,并评估为执行该转换的过程,以便您可以执行此操作(define hex->dec (make-base-converter 16 10))
  • 你能用 number->string 或 string->number 给我一个更高阶的过程吗?或者我可以做“ (define hex->dec (conversion-makes 16 10) (string->number n)) ”或类似的东西吗?会更高阶吗?因为我无法理解“make-base-converter”,它是占位符还是正确的运算符、函数或类似的东西,当我尝试运行它时,它没有定义。
猜你喜欢
  • 2014-01-04
  • 2013-05-14
  • 2018-08-22
  • 2019-03-25
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多