小编mst*_*ger的帖子

浮点精度可以依赖于线程吗?

我在C#3.0中有一个基于struct的小型3D矢量类,它使用double作为基本单元.

一个例子:一个向量的y值是

-20.0 straight
Run Code Online (Sandbox Code Playgroud)

我减去一个y值为的向量

10.094999999999965
Run Code Online (Sandbox Code Playgroud)

y我期望的价值是

-30.094999999999963         (1)
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

-30.094999313354492         (2)
Run Code Online (Sandbox Code Playgroud)

当我在一个单独的线程中进行整个计算时,我得到(1).调试器和VS快速监视器也会返回(1).但是,当我在一个线程中运行几次迭代然后从另一个线程调用该函数时,结果是(2).现在,调试器也返回(2)!

我们必须记住.NET JIT可能会将值写回内存(网站Jon Skeet),这会将精度从80位(FPU)降低到64位(双倍).但是,(2)的准确性远低于此.

vector类看起来基本上都是这样的

public struct Vector3d
{
  private readonly double _x, _y, _z;
  ...
  public static Vector3d operator -(Vector3d v1, Vector3d v2)
  {
      return new Vector3d(v1._x - v2._x, v1._y - v2._y, v1._z - v2._z);
  }  
}
Run Code Online (Sandbox Code Playgroud)

计算就像这样容易

Vector3d pos41 = pos4 - pos1;
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading floating-accuracy

6
推荐指数
1
解决办法
606
查看次数

在ANTLR4词法分析器中将无效字符视为单个标记

我正在使用antlr4语法存储库中的JSON 语法来解析编辑器插件的JSON文件.它有效,但逐个报告无效字符.以下代码段导致18个lexer错误:

{
   sometext-without-quotes : 42
}
Run Code Online (Sandbox Code Playgroud)

我想通过处理与一个更大的无效令牌相同类型的连续无效单字符令牌将其降低到1-2.

对于类似的问题,建议使用自定义词法分析器将"未知"元素粘合到较大的标记上:在antlr4词法分析器中,如何将所有剩余的"单词"作为未知标记捕获?

我假设这绕过了通常的词法错误报告,如果可能的话我想避免这种报告.对于那个相当简单的任务,是不是有适当的解决方案?它似乎在ANTLR3中默认工作.

java antlr4

6
推荐指数
1
解决办法
563
查看次数

在neo4j中提取子图

我有一个存储在Neo4j中的大型网络.基于特定的根节点,我想提取该节点周围的子图并将其存储在其他地方.所以,我需要的是符合我的过滤条件的节点和边的集合.

Afaik没有开箱即用的解决方案.有一个图形匹配组件可用,但它只适用于完美匹配.Neo4j API本身只定义了图遍历,我可以用它来定义应该访问哪些节点/边:

Traverser exp = Traversal
    .description()
    .breadthFirst()
    .evaluator(Evaluators.toDepth(2))
    .traverse(root);
Run Code Online (Sandbox Code Playgroud)

现在,我可以将所有节点/边添加到所有路径的集合中,但这是非常低效的.你会怎么做?谢谢!

编辑将每个遍历的最后一个节点和最后一个关系添加到子图中是否有意义?

subgraph neo4j

5
推荐指数
1
解决办法
5911
查看次数

标签 统计

.net ×1

antlr4 ×1

c# ×1

floating-accuracy ×1

java ×1

multithreading ×1

neo4j ×1

subgraph ×1