Scheme 方案如何运作不精确->;精确操作?

Scheme 方案如何运作不精确->;精确操作?,scheme,inexact-arithmetic,Scheme,Inexact Arithmetic,SICP中描述的Scheme程序不精确->精确是如何运行的?精确性只是一个数字的属性:它不会改变数字本身的值。因此,对于使用标志来表示精确性的实现,不精确->精确只是在该数字上设置精确性标志。精确性只是数字的一个属性:它不会更改数字本身的值。因此,对于使用标志来表示精确性的实现,increact->exact只需在该数字上设置精确性标志。方案标准仅对如何记录精确性/不精确性给出了一些一般性限制,但大多数方案实现,直到标准R5R,都按如下操作(MIT方案,即SICP的方案“母语”也是这样工作的):

SICP中描述的Scheme程序
不精确->精确
是如何运行的?

精确性只是一个数字的属性:它不会改变数字本身的值。因此,对于使用标志来表示精确性的实现,
不精确->精确
只是在该数字上设置精确性标志。

精确性只是数字的一个属性:它不会更改数字本身的值。因此,对于使用标志来表示精确性的实现,
increact->exact
只需在该数字上设置精确性标志。

方案标准仅对如何记录精确性/不精确性给出了一些一般性限制,但大多数方案实现,直到标准R5R,都按如下操作(MIT方案,即SICP的方案“母语”也是这样工作的):

  • 包含数字类型数据的每个单元格的类型信息表示数据是精确的还是不精确的
  • 数据记录上的算术运算从输入的精确性中得出结果的精确性,其中通常不精确性具有传染性:如果任何操作数不精确,结果也可能不精确。不过,请注意,在特殊情况下,允许方案实现推断精确性,例如,如果将不精确4.3乘以精确为0,您可以知道结果精确为0
  • 特殊操作“不精确->精确”和“精确->不精确”对数值类型进行强制转换,以确保生成的类型分别是精确的或不精确的
  • 一些要点:首先,不同的方案标准在运算符是否给出精确性方面有所不同;这些标准不足以确定发生了什么。例如,一些方案实现具有精确理性的表示,允许
    (/13)
    要准确表示,只有浮点数的方案实现必须准确表示


    第二,R6RS与SICP和早期标准的传染概念不同,因为坦率地说,旧标准已被打破。

    方案标准仅对如何记录精确性/不精确性给出了一些一般性限制,但大多数方案实现,直到标准R5RS,都按以下方式运行(MIT方案,即SICP的方案)“母语”也是这样:

  • 包含数字类型数据的每个单元格的类型信息表示数据是精确的还是不精确的
  • 数据记录上的算术运算从输入的精确性中得出结果的精确性,其中通常不精确性具有传染性:如果任何操作数不精确,结果也可能不精确。不过,请注意,在特殊情况下,允许方案实现推断精确性,例如,如果将不精确4.3乘以精确为0,您可以知道结果精确为0
  • 特殊操作“不精确->精确”和“精确->不精确”对数值类型进行强制转换,以确保生成的类型分别是精确的或不精确的
  • 一些要点:首先,不同的方案标准在运算符是否给出精确性方面有所不同;这些标准不足以确定发生了什么。例如,一些方案实现具有精确理性的表示,允许
    (/13)
    要准确表示,只有浮点数的方案实现必须准确表示


    第二,R6RS与SICP和早期标准的传染概念不同,因为坦率地说,旧标准已被破坏。

    这是不正确的——大多数方案实现使用IEEE 754浮点实现不精确数字,使用任意精度有理数实现精确数。这两者之间的转换不仅仅是设置一个标志。@Sam:这是一个实现细节,Scheme本身不需要它。一个实现可以自由地使用IEEE754浮点数据类型来表示精确的数字(当然,如果进一步的结果不合适,必须升级到其他数据类型,如有理数),或使用有理数表示不精确(如果愿意)。这是不正确的——大多数方案实现使用IEEE 754浮点实现不精确数字,而使用任意精度有理数实现精确数字。这两者之间的转换不仅仅是设置标志。@Sam:这是方案p不需要的实现细节一个实现可以自由地使用IEEE754浮点数据类型来表示精确的数字(当然,如果进一步的结果不合适,则必须升级到其他数据类型,如有理数),或者如果它愿意,可以使用有理数来表示不精确的数。