C# 缩放大值

C# 缩放大值,c#,double,C#,Double,我已经创建了简单的WPF控件来在我的应用程序中绘制图表。现在我需要在上面画一个f(x)=2^x函数。所有值(来自指定范围)必须在图表上可见-它们应缩放,以便maxX的f(x)值位于右上角。不幸的是,x的值可能很大,即1000。对于大值,Math.Pow()返回无穷大 我看到的解决方案是手动计算Math.Pow()值——在每一步中,我都会将之前的所有值除以,而不是将最大值乘以2(我并不需要f(x)值本身)。但也许你会找到更好的解决方案。好吧,你知道最大值,它是2**max\ux。因此,通过以下方法

我已经创建了简单的WPF控件来在我的应用程序中绘制图表。现在我需要在上面画一个f(x)=2^x函数。所有值(来自指定范围)必须在图表上可见-它们应缩放,以便maxX的f(x)值位于右上角。不幸的是,x的值可能很大,即1000。对于大值,Math.Pow()返回无穷大


我看到的解决方案是手动计算Math.Pow()值——在每一步中,我都会将之前的所有值除以,而不是将最大值乘以2(我并不需要f(x)值本身)。但也许你会找到更好的解决方案。

好吧,你知道最大值,它是
2**max\ux
。因此,通过以下方法规范化所有值:

y_norm = y / 2 ** max_x
       = 2 ** x * 2 ** -max_x
       = 2 ** (x - max_x)

嗯,你知道最大值,它是
2**max\ux
。因此,通过以下方法规范化所有值:

y_norm = y / 2 ** max_x
       = 2 ** x * 2 ** -max_x
       = 2 ** (x - max_x)

问题是max_x(或x-max_x)可能是1000。我不能简单地计算2^1000。@Marcin:要么使用对数图,在这种情况下计算
(x-max\u x)*lg 2
,要么计算
2**-1000
,它舍入为零,这很好,因为显示的精度远远低于浮点数。(虽然
2**1000
2**-1000
实际上可以用双精度浮点表示)。是的,我可以将
2^1000
作为双精度,但
2^2000
不能。假设我有两个x值-999和1000。在这种情况下,我将在右上角显示
2^1000
,在左下角显示
2^999
。值之间的差值只有
2^1
倍,但也可能是
2^1000
或更多。我不能假设差值太小以至于我可以计算出来,也不能假设差值太大以至于我不能画更小的值。@Marcin:当你画更小的值时会发生什么?在这种情况下,让它们四舍五入到零并不重要,除非你的屏幕高度超过2**1000像素。好吧,我误解了你:)一切似乎都很好,我在图表上看到了几乎垂直的线条。Thx:d问题是max_x(或x-max_x)可以是1000。我不能简单地计算2^1000。@Marcin:要么使用对数图,在这种情况下计算
(x-max\u x)*lg 2
,要么计算
2**-1000
,它舍入为零,这很好,因为显示的精度远远低于浮点数。(虽然
2**1000
2**-1000
实际上可以用双精度浮点表示)。是的,我可以将
2^1000
作为双精度,但
2^2000
不能。假设我有两个x值-999和1000。在这种情况下,我将在右上角显示
2^1000
,在左下角显示
2^999
。值之间的差值只有
2^1
倍,但也可能是
2^1000
或更多。我不能假设差值太小以至于我可以计算出来,也不能假设差值太大以至于我不能画更小的值。@Marcin:当你画更小的值时会发生什么?在这种情况下,让它们四舍五入到零并不重要,除非你的屏幕高度超过2**1000像素。好吧,我误解了你:)一切似乎都很好,我在图表上看到了几乎垂直的线条。Thx:D