• Unity Mono和.Net平台浮点算法的区别


    1. static void TestFloat()
    2. {
    3. {
    4. //float speed=2.0f/20;
    5. float speed = 0.1f;
    6. float distance = 2.0f;
    7. long needTime = (long)(distance / speed);
    8. Log.Debug($"needTime={needTime}");
    9. #if UNITY_EDITOR
    10. if (needTime != 19)
    11. #else
    12. if (needTime != 20)//.Net服务器和安卓手机
    13. #endif
    14. Log.Warning("平台浮点算法变了");
    15. }
    16. }
    17. static void TestFixInt()
    18. {
    19. {
    20. FixInt fi2 = 20000;
    21. FixInt fi1 = 10000;
    22. if (fi1 / fi2 != 0.5f)
    23. {
    24. Log.Warning($"TestFixInt,{fi2}/{fi1} != 0.5");
    25. }
    26. }
    27. {
    28. FixInt fi2 = 20000;
    29. FixInt fi1 = 10000;
    30. if (fi2 / fi1 != 2)
    31. {
    32. Log.Warning($"TestFixInt,{fi2}/{fi1} != 2");
    33. }
    34. }
    35. {
    36. const long l = 20000;
    37. FixInt fi = new(6000);
    38. if (l < fi)
    39. {
    40. Log.Warning($"TestFixInt,{l} < {fi}");
    41. }
    42. }
    43. {
    44. FixInt fi3 = new(3);
    45. FixInt fi5 = new(5);
    46. if (fi3 + 1000 < fi5)
    47. {
    48. Log.Warning($"TestFixInt,{fi3} , {fi5}");
    49. }
    50. }
    51. {
    52. const long l = 3000;
    53. FixInt fi = l;
    54. if (fi.RawLong != l)
    55. {
    56. Log.Warning($"TestFixInt,{fi.RawLong} != {l}");
    57. }
    58. }
    59. }
    60. static void TestGetPolygonFormation()
    61. {
    62. var points = TeamFormationComponentSystem.GetPolygonFormation(new(),
    63. new() { x = 230.33540344238281f, y = -0.0000019073486328125f, z = 62.280677795410156f },
    64. new() { x = -6.1755828857421875f, y = -0.045724689960479736f, z = 9.5355415344238281f },
    65. 4,
    66. 2);
    67. List list = new()
    68. {
    69. new(){x = 230.429f, y = 0.0f, z = 62.135f },
    70. new(){ x = 233.077f, y = 0.0f, z = 60.689f },
    71. new(){ x = 233.317f, y = 0.0f, z = 57.679f },
    72. new(){ x = 230.669f, y = 0.0f, z = 59.125f },
    73. };
    74. if (points.Count != list.Count)
    75. {
    76. Log.Warning($"TestGetPolygonFormation,{points} != {list}");
    77. }
    78. for (int i = 0; i
    79. {
    80. var cal = points[i];
    81. var want = list[i];
    82. if (!cal.Equals(want))
    83. {
    84. Log.Warning($"TestGetPolygonFormation,{cal} != {want}");
    85. }
    86. }
    87. }
    88. static void TestGetPointOnEllipse()
    89. {
    90. var radius = 2.82842707633972f;
    91. var intervalAngle = 90;
    92. var radian = -32.9286422729492f + (intervalAngle * 3);
    93. var dChangZhouAngle = -45f;
    94. var xShaft = 0.5f * radius;
    95. var yShaft = 1f * radius;
    96. var ptCenter = new float2(231.872909545898f, 59.9066619873047f);
    97. var cal = VectorHelper.GetPointOnEllipse(ptCenter,
    98. xShaft,
    99. yShaft,
    100. radian,
    101. dChangZhouAngle); //算出旋转后的向量
    102. float3 want = new() { x = 230.669f, y = 0.0f, z = 59.125f };
    103. if (!cal.Equals(want))
    104. {
    105. Log.Warning($"TestGetPointOnEllipse,{cal} != {want}");
    106. }
    107. }
    108. static void TestMath()
    109. {
    110. var radius = 2.82842707633972f;
    111. var intervalAngle = 90;
    112. var radian = -32.9286422729492f + (intervalAngle * 3);
    113. var dChangZhouAngle = -45f;
    114. var xShaft = 0.5f * radius;
    115. var yShaft = 1f * radius;
    116. var ptCenter = new float2(231.872909545898f, 59.9066619873047f);
    117. radian -= dChangZhouAngle;
    118. dChangZhouAngle *= VectorHelper.Mathf.Deg2Rad;
    119. radian *= VectorHelper.Mathf.Deg2Rad;
    120. float dLiXin = math.atan2(yShaft * math.sin(radian), xShaft * math.cos(radian)); //离心角
    121. if (dLiXin != -1.46427190303802f)
    122. {
    123. Log.Warning($"TestMath,{dLiXin} ");
    124. }
    125. if (yShaft != 2.8284270763397221f)
    126. {
    127. Log.Warning($"TestMath,{yShaft} ");
    128. }
    129. if (dLiXin != -1.4642719030380249f)
    130. {
    131. Log.Warning($"TestMath,{dLiXin} ");
    132. }
    133. if (dChangZhouAngle != -0.78539818525314298f)
    134. {
    135. Log.Warning($"TestMath,{dChangZhouAngle} ");
    136. }
    137. if (xShaft != 1.4142135381698611f)
    138. {
    139. Log.Warning($"TestMath,{xShaft} ");
    140. }
    141. var cosLiXin = math.cos(dLiXin);
    142. var sinChangZhouAngle = math.sin(dChangZhouAngle);
    143. var sinLiXin = math.sin(dLiXin);
    144. var cosChangZhouAngle = math.cos(dChangZhouAngle);
    145. if (cosLiXin != 0.10632307827472701f)
    146. {
    147. Log.Warning($"TestMath,{xShaft} ");
    148. }
    149. if (sinChangZhouAngle != -0.70710676908492998f)
    150. {
    151. Log.Warning($"TestMath,{xShaft} ");
    152. }
    153. if (sinLiXin != -0.99433165788650502f)
    154. {
    155. Log.Warning($"TestMath,{xShaft} ");
    156. }
    157. if (cosChangZhouAngle != 0.70710676908492998f)
    158. {
    159. Log.Warning($"TestMath,{xShaft} ");
    160. }
    161. var x = yShaft * cosLiXin * sinChangZhouAngle + xShaft * sinLiXin * cosChangZhouAngle + ptCenter.x;
    162. #if UNITY_EDITOR
    163. if (x != 230.665939331055f)
    164. #else
    165. if (x != 230.66592407226563f)
    166. #endif
    167. {
    168. Log.Warning($"平台浮点加法或乘法算法变了,{x} ");
    169. }
    170. float y = yShaft * math.cos(dLiXin) * math.cos(dChangZhouAngle) - xShaft * math.sin(dLiXin) * math.sin(dChangZhouAngle) + ptCenter.y;
    171. }

    结论
    .Net和安卓手机IL2CPP算法相同
    Windows下Unity的Mono算法不同,就它不同

  • 相关阅读:
    通过 3 个 Chainlink 服务开发一个 Dynamic NFT 项目
    还在写SQL做SAP二开?通过RFC调用NetWeaver,让HANA数据库操作更可靠
    [附源码]Python计算机毕业设计SSM家政信息管理平台(程序+LW)
    低代码助力企业数字化转型
    【算法详解】如何使用递归,递归使用的技巧详解
    Oracle(2-2)Oracle Net Architecture
    MySQL事务详解(事务隔离级别、实现、MVCC、幻读)
    神经元网络技术有限公司,神经网络网站
    OpenJudge NOI题库 入门 116题 (三)
    测试工程师提前做什么才能避免35岁危机?
  • 原文地址:https://blog.csdn.net/brook0344/article/details/133915005