GVKun编程网logo

编译器会优化重复的数学计算吗?(编译器会优化重复的数学计算吗为什么)

18

在这篇文章中,我们将带领您了解编译器会优化重复的数学计算吗?的全貌,包括编译器会优化重复的数学计算吗为什么的相关情况。同时,我们还将为您介绍有关2D向量的数学计算、Android-精确的数学计算、as

在这篇文章中,我们将带领您了解编译器会优化重复的数学计算吗?的全貌,包括编译器会优化重复的数学计算吗为什么的相关情况。同时,我们还将为您介绍有关2D向量的数学计算、Android-精确的数学计算、asp.net – .NET JIT编译器会优化方法调用吗?、Bash中的数学计算总结的知识,以帮助您更好地理解这个主题。

本文目录一览:

编译器会优化重复的数学计算吗?(编译器会优化重复的数学计算吗为什么)

编译器会优化重复的数学计算吗?(编译器会优化重复的数学计算吗为什么)

Java编译器会优化简单的重复数学运算,例如:

if (prevX / width != curX / width) {
    // Do something with prevX / width value
} else {
    // Do something with curX / width value
}

我知道我可以将结果分配给if语句之前的变量,然后返回变量,但这有点麻烦。如果编译器自动识别出正在执行相同的计算,并将结果自己缓存到临时变量中,我宁愿遵守上述约定。

*编辑-我是个白痴。我试图简单/过多地提出我的问题。它不是简单的:if(x> y)

2D向量的数学计算

2D向量的数学计算

2D向量的数学计算


这些代码摘抄自BLIZZARDINTERFACECODEVector2D.lua部分

-- 数学意义在于向量围成的面积  a × b = |a||b|sinθ
-- 几何上二维向量叉乘是没有意义的,这个实现返回的值是垂直于向量a与向量b平面的向量的模,在3D数学中,向量叉乘返回的应该是一个向量
-- https://stackoverflow.com/questions/243945/calculating-a-2d-vectors-cross-product
-- 这个实现并不"合理",It''s a shorthand notation for a mathematical hack.
function Vector2D_Cross(leftX, leftY, rightX, rightY)
	return leftX * rightY - leftY * rightX;
end

-- a·b = |a||b|cosθ
function Vector2D_Dot(leftX, leftY, rightX, rightY)
	return leftX * rightX + leftY * rightY;
end

--向量模的平方
function Vector2D_GetLengthSquared(x, y)
	return Vector2D_Dot(x, y, x, y);
end

-- 向量的模,注意求平方根是一个消耗较大的操作,所以若是简单的比较两个向量的模的大小可用模的平方代替.
function Vector2D_GetLength(x, y)
	return sqrt(Vector2D_GetLengthSquared(x, y));
end

-- 单位向量
function Vector2D_Normalize(x, y)
	return Vector2D_DivideBy(Vector2D_GetLength(x, y), x, y);
end

-- 两个向量的夹角度:  tanθ = sinθ /cosθ;atan2(x,y) = atan(y/x)
function Vector2D_CalculateAngleBetween(leftX, leftY, rightX, rightY)
	return atan2(Vector2D_Cross(leftX, leftY, rightX, rightY), Vector2D_Dot(leftX, leftY, rightX, rightY));
end

-- 旋转弧度
function Vector2D_RotateDirection(rotationRadians, x, y)
	local cosValue = cos(rotationRadians);
	local sinValue = sin(rotationRadians);
	return x * cosValue - y * sinValue, x * sinValue + y * cosValue;
end

Android-精确的数学计算

Android-精确的数学计算

我遇到了一个问题,我正在开发一个应该能够进行一些数学计算的应用程序。这些计算必须是准确的(或者显然不是错误的)

但是这个简单的代码

double a = 3.048d;
double b = 1000d;

double c = a / b;

给我一个错误的结果c不是预期的0.003048而是0.0030480000000000004这显然是错误的。

double d = 3.048 / 1000;

第二个代码片段给出了正确的结果。

我知道在使用计算机进行计算时,并不是所有的浮点运算都是精确的,但是我不知道如何解决这个问题。

提前致谢!
路德维希

开发以下产品:
-Android 2.2
测试设备:
-HTC Desire

asp.net – .NET JIT编译器会优化方法调用吗?

asp.net – .NET JIT编译器会优化方法调用吗?

我从ASP.NET应用程序返回的堆栈跟踪,从ArgumentNullException生成,给人的印象是下面代码的最后一行发生错误.据我所知,这是不可能的,但如果JIT优化了对Bar的调用,这将导致不同的堆栈跟踪,它将解释所有.我肯定知道它不是c#编译器,因为CIL看起来像我期望的那样.是否有可能JIT编译器删除了对Bar的调用?

c#4,.NET 4.0.30319.1,ASP.NET 4.0.30319.1

编辑:
我应该提到这是一个发布配置,Optimize code = on,Debug Info = pdb-only.

Stack Trace:

[ArgumentNullException: Value cannot be null. Parameter name: value]
CreateHiddenField(HtmlTextWriter tr,String name,String value) in Foo.cs:129
Foo(IHttpContext context,HtmlTextWriter writer) in Foo.cs:106
private static void Foo(IHttpContext context,HtmlTextWriter writer)
{ // line 103
  Bar(writer,AuthorizationServerResponseDetailsHttpRequestParser.RequestSAMLFieldName,context);
  Bar(writer,AuthorizationServerResponseDetailsHttpRequestParser.RequestTargetFieldName,context);
  // line 106 - blank line in source code.
  CreateHiddenField(tr,name,string.Empty); // looks like its here
}

private static void Bar(HtmlTextWriter tr,string name,IHttpContext context)
{ // line 116
   #region Sanitation
   if (tr == null) { throw new System.ArgumentNullException("tr"); }
   if (name == null) { throw new System.ArgumentNullException("name"); }
   if (context == null) { throw new System.ArgumentNullException("context"); }
   #endregion

   CreateHiddenField(tr,context.RequestQueryString(name));
}

private static void CreateHiddenField(HtmlTextWriter tr,string value)
{ // line 127
   #region Sanitation
   if (tr == null) { throw new System.ArgumentNullException("tr"); }
   if (name == null) { throw new System.ArgumentNullException("name"); }
   if (value == null) { throw new System.ArgumentNullException("value"); }
   #endregion

   // payload...
}

解决方法

根据 http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx,如果JITter内联方法调用,它确实会在堆栈跟踪中折叠.如果您不希望它内联(这可能不是一个好主意),您可以使用

[MethodImpl(MethodImplOptions.NoInlining)]

关于方法.对于exe,您还可以使用INI文件告诉JITter生成跟踪信息(在链接页面的底部),但我不确定这对ASP.NET应用程序有何用处.

Bash中的数学计算总结

Bash中的数学计算总结

在嵌入式开发编写shell脚本的时候,经常会用到一些简单的shell数学计算,但是每次用完后就忘记了,又要上网查,这里对常用的计算方式进行总结。不过需要注意的是,因为嵌入式开发中使用的busyBox之类都是裁减过的,可能一些方式是不支持的,此时可以先对这些方法都进行一下测试,然后再选择可行的方法。

  1. 使用let计算

    $ var=1;let "var+=1";echo $var
    • let几乎支持所有的运算符
    • 方幂运算应使用“**”
    • 变量在表达式中直接访问,不必加$
    • 一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上
    • let后的表达式只能进行整数运算
  2. 使用(())

    $ var=1;((var+=1));echo $var

    (())的使用方法与let关键字完全相同。

  3. 使用$[]

    $ var=1;var=$[$var+1];echo $var
    • $[]将中括号内的表达式作为数学运算先计算结果再输出
    • 对$[]中的变量进行访问时前面需要加$
    • $[]支持的运算符与let相同,但也只支持整数运算
  4. 使用expr

    $ var=1;var=`expr $var + 1`;echo $var
    • expr后的表达式符号间需用空格隔开
    • expr支持的操作符有: |、&、< >=、<、+、-、*、/、%
    • expr支持的操作符中在使用时需用\进行转义的有:|、&、< >=、<、*
    • expr同样只支持整数运算
  5. 使用bc

    bc是linux下的一个简单计算器,支持浮点数计算,在命令行下输入bc即进入计算器程序,而我们想在程序中直接进行浮点数计算时,利用一个简单的管道即可解决问题。

    $ var=1;var=`echo "$var+1"|bc`;echo $var
    • bc支持除位操作运算符之外的所有运算符。
    • bc中要使用scale进行精度设置,如scale=2设置小数点2位精度
  6. 使用awk

    awk是一种文本处理工具,同时也是一种程序设计语言,作为一种程序设计语言,awk支持多种运算,而我们可以利用awk来进行浮点数计算,和上面bc一样,通过一个简单的管道,我们便可在程序中直接调用awk进行浮点数计算。

    $ var=1;var=`echo "$var 1"|awk '{printf("%g",$1+$2)}'`;echo $var
    • awk支持除位操作运算符之外的所有运算符
    • awk内置有log、sqr、cos、sin等等函数

今天的关于编译器会优化重复的数学计算吗?编译器会优化重复的数学计算吗为什么的分享已经结束,谢谢您的关注,如果想了解更多关于2D向量的数学计算、Android-精确的数学计算、asp.net – .NET JIT编译器会优化方法调用吗?、Bash中的数学计算总结的相关知识,请在本站进行查询。

本文标签: