コンピュータ数学

数学とコンピュータ数学の比較。

数学 int, decimal double, float
任意の数字が対象 有限桁数が対象 有限有効桁数、有限指数が対象
数字以外は計算の対象外 最大値、最小値を表せ、計算対象となる 最大値、最小値、イプシロン、非数値、+無限大、-無限大を表せ、計算対象となる
数学のルールは成り立つ 有効桁数内での数学のルールは成り立つ 数学のルールで規定されない演算もでき、桁落ちなどにより、数学のルールが成り立たないこともある
0割は許されない 0割は例外 0割は矛盾しない計算
無限大は数字ではない 無限大は表現できない 無限大も計算対象なので、数字と同様に扱える
非数値は数字ではない 非数値は表現できない 非数値も計算対象なので、数字と同様に扱える

doubleの演算

  • double.NaN != double.NaN
  • double.IsNaN(double.NaN)
  • double.NegativeInfinity == double.NegativeInfinity
  • double.IsNegativeInfinity(double.NegativeInfinity)
  • double.IsInfinity(double.NegativeInfinity)
  • double.PositiveInfinity == double.PositiveInfinity
  • double.IsPositiveInfinity(double.PositiveInfinity)
  • double.IsInfinity(double.PositiveInfinity)
  • double.IsNaN(double.IsNaN と 任意のdoubleとの演算) // NaNに何をしてもNaN
  • double.IsNaN(0.0 / 0)
  • 1.0 / 0 == double.PositiveInfinity
  • -1.0 / 0 == double.NegativeInfinity
  • double.Epsilon + 0 == double.Epsilon
  • double.Epsilon * 1 == double.Epsilon
  • double.Epsilon + 1e-307 == 1e-307
  • double.Epsilon + 1e-308 != 1e-308
  • double.Epsilon * double.PositiveInfinity == double.PositiveInfinity
  • double.Epsilon * double.NegativeInfinity == double.NegativeInfinity
  • double.Epsilon / 0 == double.PositiveInfinity
  • double.MaxValue + 1e292 == double.PositiveInfinity
  • double.MaxValue + 1e291 != double.PositiveInfinity
  • double.MaxValue * (1 + 1e-15) == double.PositiveInfinity
  • double.MaxValue * (1 + 1e-16) != double.PositiveInfinity
  • double.MaxValue / 0 == double.PositiveInfinity
  • double.MinValue - 1e292 == double.NegativeInfinity
  • double.MinValue - 1e291 != double.NegativeInfinity
  • double.MinValue * (1 + 1e-15) == double.NegativeInfinity
  • double.MinValue * (1 + 1e-16) != double.NegativeInfinity
  • double.MinValue / 0 == double.NegativeInfinity
  • Math.Abs(double.MaxValue * double.Epsilon - 8.8817842e-16) < 1e-24
  • double.NegativeInfinity < 0
  • double.IsNaN(double.NegativeInfinity * 0)
  • double.IsNaN(double.PositiveInfinity * 0)
  • double.IsNaN(double.NegativeInfinity + double.PositiveInfinity)
  • double.IsNaN(double.NegativeInfinity - double.NegativeInfinity)
  • double.IsNaN(double.PositiveInfinity - double.PositiveInfinity)
  • -double.NegativeInfinity == double.PositiveInfinity
  • double.NegativeInfinity / 0 == double.NegativeInfinity
  • double.PositiveInfinity / 0 == double.PositiveInfinity
  • -1 / double.Epsilon == double.NegativeInfinity
  • 1 / double.Epsilon == double.PositiveInfinity
  • Math.Abs(1 / double.MaxValue - 5.562685e-309) < 1e-315
  • Math.Abs(1 / double.MinValue + 5.562685e-309) < 1e-315
  • 1 / double.NegativeInfinity == 0
  • double.MaxValue / double.NegativeInfinity == 0
  • double.MinValue / double.NegativeInfinity == 0
  • 1 / double.PositiveInfinity == 0
  • double.MaxValue / double.PositiveInfinity == 0
  • double.MinValue / double.PositiveInfinity == 0
  • double.IsNaN(double.NegativeInfinity / double.NegativeInfinity)
  • double.IsNaN(double.NegativeInfinity / double.PositiveInfinity)
  • double.IsNaN(double.PositiveInfinity / double.PositiveInfinity)
  • double.NegativeInfinity の符号を変えない演算は double.NegativeInfinity
  • double.NegativeInfinity の符号を変える演算は double.PositiveInfinity
  • double.PositiveInfinity の符号を変えない演算は double.PositiveInfinity
  • double.PositiveInfinity の符号を変える演算は double.NegativeInfinity


HttpListenerのサンプル。8080ポートを開けていれば、別マシンからもアクセス可能。

public static void HttpListenerSample()
{
	if (!HttpListener.IsSupported)
	{
		Console.WriteLine("Not supported");
		return;
	}
	HttpListener listener = new HttpListener();
	listener.Prefixes.Add("http://+:8080/sample/");
	try
	{
		listener.Start();
		while (true)
		{
            HttpListenerContext context = listener.GetContext();
			using (HttpListenerResponse res = context.Response)
			using (StreamWriter sw = new StreamWriter(res.OutputStream))
			{
				sw.WriteLine("<html><head><title>{0}</title></head><body>{0}</body></html>",
					"This is a sample");
			}
		}
	}
	catch (Exception e)
	{
		Console.WriteLine(e.Message);
	}
	finally
	{
		listener.Close();
	}
}