【问题标题】:Please explain the purpose of the bitwise or in this javascript function请解释按位或在此 javascript 函数中的目的
【发布时间】:2022-05-07 07:20:13
【问题描述】:

我正在将一个 javascript 函数转换为 java,并且不明白下面代码中按位或的目的:

  1. (Math.tan(PHId)) ^ 2) - 这是确保数字始终以 2 结尾吗?

  2. (Et ^ 6)

    该代码是用于将爱尔兰网格参考转换为纬度和经度的库的一部分:http://www.nearby.org.uk/tests/geotools2.js

    GT_Math.E_N_to_Lat = function(East, North, a, b, e0, n0, f0, PHI0, LAM0)
    {
        //Un-project Transverse Mercator eastings and northings back to latitude.
        //Input: - _
        //eastings (East) and northings (North) in meters; _
        //ellipsoid axis dimensions (a & b) in meters; _
        //eastings (e0) and northings (n0) of false origin in meters; _
        //central meridian scale factor (f0) and _
        //latitude (PHI0) and longitude (LAM0) of false origin in decimal degrees.
    
        //\'REQUIRES THE \"Marc\" AND \"InitialLat\" FUNCTIONS
    
        //Convert angle measures to radians
        var Pi = 3.14159265358979;
        var RadPHI0 = PHI0 * (Pi / 180);
        var RadLAM0 = LAM0 * (Pi / 180);
    
        //Compute af0, bf0, e squared (e2), n and Et
        var af0 = a * f0;
        var bf0 = b * f0;
        var e2 = (Math.pow(af0,2) - Math.pow(bf0,2)) / Math.pow(af0,2);
        var n = (af0 - bf0) / (af0 + bf0);
        var Et = East - e0;
    
        //Compute initial value for latitude (PHI) in radians
        var PHId = GT_Math.InitialLat(North, n0, af0, RadPHI0, n, bf0);
        
        //Compute nu, rho and eta2 using value for PHId
        var nu = af0 / (Math.sqrt(1 - (e2 * ( Math.pow(Math.sin(PHId),2)))));
        var rho = (nu * (1 - e2)) / (1 - (e2 * Math.pow(Math.sin(PHId),2)));
        var eta2 = (nu / rho) - 1;
        
        //Compute Latitude
        var VII = (Math.tan(PHId)) / (2 * rho * nu);
        var VIII = ((Math.tan(PHId)) / (24 * rho * Math.pow(nu,3))) * (5 + (3 * (Math.pow(Math.tan(PHId),2))) + eta2 - (9 * eta2 * (Math.pow(Math.tan(PHId),2))));
        var IX = ((Math.tan(PHId)) / (720 * rho * Math.pow(nu,5))) * (61 + (90 * ((Math.tan(PHId)) ^ 2)) + (45 * (Math.pow(Math.tan(PHId),4))));
        
        var E_N_to_Lat = (180 / Pi) * (PHId - (Math.pow(Et,2) * VII) + (Math.pow(Et,4) * VIII) - ((Et ^ 6) * IX));
        
        return (E_N_to_Lat);
    }
    
  • 您能否进一步解释一下您不完全了解的内容? ^ is bitwise XOR
  • 我不确定javascript中 (Math.tan(PHId)) 的结果是什么类型?我想这是某种算术捷径,但如果结果是双精度/浮点数,我看不出它是如何工作的。谢谢,马克。
  • 好的,我发现了这一点:在执行按位运算之前,JavaScript 将数字转换为 32 位有符号整数。执行按位运算后,结果将转换回 64 位 JavaScript 数字。
  • 你有这个算法的描述吗?
  • 不抱歉,只有 javascript 函数中的注释。

标签: javascript bitwise-operators


【解决方案1】:

我建议询问脚本的作者。

但是,我有理由确定这只是一个错误,其含义是 Math.tan(PHId) ** 2 / Math.pow(Math.tan(PHId), 2)Et ** 6/ Math.pow(Et, 6),即取幂而不是按位或。我相信这是因为

  • 按位或在数字代码中没有意义
  • 这看起来很像级数展开式 - 前面的项也使用幂运算,并且该错误可能没有被注意到,因为它只引入了一个小错误
  • 脚本中的所有其他方法(E_N_to_LongLat_Long_to_EastLat_Long_to_North)到处都使用Math.powE_N_to_Lat是唯一使用^的方法

我正在将 javascript 函数转换为 java

注意the script顶部的评论:

 * Credits

 * The algorithm used by the script for WGS84-OSGB36 conversions is derived 
 * from an OSGB spreadsheet (www.gps.gov.uk) with permission. This has been
 * adapted into PHP by Ian Harris, and Irish added by Barry Hunter

我建议从这些主要来源开始,而不是将 JavaScript 翻译、PHP 翻译、电子表格公式翻译、数学翻译成 Java。

【讨论】:

  • 非常感谢您的回复。我已经问过作者,他要检查原始的 PHP 代码。 ^2 引入的错误是 2x10-8,因此您正确得出的结论非常小。
  • 我联系了作者,这确实是原始 PHP 代码的转换错误,应该提高 XOR 的能力。感谢所有的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-08-13
  • 2019-06-26
  • 2021-11-27
  • 2018-02-25
  • 1970-01-01
  • 2012-08-23
  • 2011-03-22
  • 2014-04-23
相关资源
最近更新 更多