首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >小的基本海龟MoveTo错误“值要么太大,要么太小,对于一个十进制。

小的基本海龟MoveTo错误“值要么太大,要么太小,对于一个十进制。
EN

Stack Overflow用户
提问于 2018-10-07 22:08:25
回答 1查看 207关注 0票数 1

这段代码似乎抛出了一个异常,“对于Decimal来说,值要么太大要么太小。”

以某种方式更改变量y1、y2、x将删除一个错误。例如,y2从41到38。

我怎么才能解决这个问题?

代码语言:javascript
复制
Turtle.Speed = 10
x = 10
y1 = 42
y2 = 41
Turtle.Angle = 180
Turtle.MoveTo(x, y2)
Turtle.MoveTo(x, y1)

错误跟踪:

代码语言:javascript
复制
in System.Decimal..ctor(Double value)
in System.Decimal.op_Explicit(Double value)
in Microsoft.SmallBasic.Library.Primitive.op_Implicit(Double value)
in Microsoft.SmallBasic.Library.Turtle.MoveTo(Primitive x, Primitive y)
in _SmallBasicProgram._Main()

1.0和1.2版本都是如此。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-07 22:39:22

问题是SmallBasic (在1.2版中)从原语到双重实现是有缺陷的。下面是如何将double转换成原语的方法。

代码语言:javascript
复制
new Primitive((Decimal) primitiveDouble);

但是,这是一个不安全的操作,因为不是所有的double值都可以(精确地)表示。在这些情况下,强制转换为Decimal将引发异常。

下面是在C#中重现这样一个异常的一种简单方法:

代码语言:javascript
复制
double x = double.MinValue; // [smallest] denormalized value
decimal f = (decimal)x;

这发生在MoveTo(x,y)操作中,该操作通过三角运算将MoveTo转换为Turn+Move组合。对于某些输入(以及海龟所在的位置),这将导致双倍,无法安全地转化为十进制值。

显式使用Turn+Move将避免出现问题的数学,因此应该避免问题--至少在这种特殊情况下是这样的。

作为参考,下面是MoveTo的反编译源:

代码语言:javascript
复制
/// <summary>
/// Turns and moves the turtle to the specified location.  If the pen is down, it will draw a line as it moves.
/// </summary>
/// <param name="x">The x co-ordinate of the destination point.</param>
/// <param name="y">The y co-ordinate of the destination point.</param>
public static void MoveTo(Primitive x, Primitive y)
{
  double d = (double) ((x - Turtle.X) * (x - Turtle.X) + (y - Turtle.Y) * (y - Turtle.Y));
  if (d == 0.0)
    return;
  double num1 = System.Math.Sqrt(d);
  double num2 = System.Math.Acos((double) (Turtle.Y - y) / num1) * 180.0 / System.Math.PI;
  if ((bool) (x < Turtle.X))
    num2 = 360.0 - num2;
  double num3 = num2 - (double) ((int) Turtle.Angle % 360);
  if (num3 > 180.0)
    num3 -= 360.0;
  Turtle.Turn((Primitive) num3); // goes boom here..
  Turtle.Move((Primitive) num1); // ..or here
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52693343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档