我想将1.0以下最接近的数字作为浮点数.通过阅读维基百科上的文章IEEE-754我已经设法找出1.0二进制表示3FF0000000000000,所以最接近的双值实际上是0x3FEFFFFFFFFFFFFF.
我知道使用这个二进制数据初始化double的唯一方法是:
double a;
*((unsigned*)(&a) + 1) = 0x3FEFFFFF;
*((unsigned*)(&a) + 0) = 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)
使用起来相当麻烦.
有没有更好的方法来定义这个双号,如果可能的话,作为常量?
我正在研究一个错过了项目的项目,由于某些原因,即使应该有例外也没有例外.在内心深处,我发现了这种错误处理:
try {
m.invoke(parentObject, paramObj);
} catch (IllegalArgumentException e) {
new CaseLibException(e);
} catch (IllegalAccessException e) {
new CaseLibException(e);
} catch (InvocationTargetException e) {
new CaseLibException(e);
}
Run Code Online (Sandbox Code Playgroud)
我的大脑认识到有几个例外被包裹在另一个中,所以这并不是那么糟糕.但我不得不偶然发现这段代码至少3次,看看有什么遗漏......
你找不到的最愚蠢的bug是什么?
这个简单的示例代码演示了该问题.我创建了一个ArrayBlockingQueue和一个等待这个队列上的数据的线程take().循环结束后,理论上队列和线程都可以被垃圾收集,但实际上我很快就会得到一个OutOfMemoryError.是什么阻止了这个GC,以及如何解决这个问题?
/**
* Produces out of memory exception because the thread cannot be garbage
* collected.
*/
@Test
public void checkLeak() {
int count = 0;
while (true) {
// just a simple demo, not useful code.
final ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(2);
final Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
abq.take();
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
// perform a GC …Run Code Online (Sandbox Code Playgroud) 我们将svn:externals用于库的特定修订版,例如
xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/
Run Code Online (Sandbox Code Playgroud)
当您在工作副本中对这样的已检出外部进行修改时,即使外部链接指向特定修订而不是HEAD,也可以提交.
在svn update提交后运行时,更改将在工作副本中消失,因为subversion会将所有内容还原为修订版12345.因此,您自己从未真正看到更改,但它们仍然在HEAD中,这很糟糕.
是否可以仅在外部未指向HEAD修订版时禁止提交?
我们有一些看起来像这样的代码:
inline int calc_something(double x) {
if (x > 0.0) {
// do something
return 1;
} else {
// do something else
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当使用标志时/fp:fast,我们得到了calc_something(0)==1明显错误的代码路径.这只发生在我们在代码中的多个点使用不同参数的方法时,所以我认为编译器(Microsoft Visual Studio 2008,SP1)中存在一些可疑的优化.
此外,当我们将接口更改为时,上述问题也消失了
inline int calc_something(const double& x) {
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么这会解决这个奇怪的行为.任何人都可以解释这种行为吗?如果我无法理解发生了什么,我们将不得不删除/fp:fast开关,但这会使我们的应用程序慢一点.
c++ floating-accuracy compiler-optimization visual-studio-2008
我们有一个搜索结果映射列表,例如一个简单的URL映射可能看起来像
"stackoverflow" - >"www.stackoverflow.com""joel" - >"www.joelonsoftware.com"
所以搜索确切的短语工作正常.
现在我们正在寻找增量搜索/预先输入,例如"stackover"也将返回"www.stackoverflow.com".我们当然可以相应地填充我们的地图,例如将每个可能的字符串放入地图中,从给定最小尺寸的所有变化开始
- >地图键:
stack - > stackoverflow ... stackoverf - > stackoverflow stackoverfl - > stackoverflow stackoverflo - > stackoverflow stackoverflow - > stackoverflow
然而,这意味着需要更高的内存占用(我猜).
有什么建议?
在C#中,我用属性标记了一些类的属性,并且我使用反射来查找这些属性,以便对它们执行获取和设置.然而,我发现以这种方式获得/设置反射大约是POCO获取/设置的10倍.除了放弃上述基本场景以使用替代技术之外,是否有任何记录的技巧可以使这种性能显着提升,例如某种缓存技术?
我尝试向 Java Swing 动态添加节点JTree,并且用户应该能够在不断添加节点的同时浏览和折叠层次结构。Thread.sleep(10)当我在循环中添加 a 时,它工作正常;但这是一个肮脏的黑客......
这是触发此问题的精简代码。每当我运行它并双击根节点以展开/折叠它(在添加节点时),我都会得到一个ArrayIndexOutOfBoundsException. 当我添加一个时,Thread.sleep(10)这不会发生。我猜这是一个线程问题,但我不知道如何同步?任何提示将不胜感激!
public static void main(String[] args) throws InterruptedException {
final JFrame frame = new JFrame();
frame.setSize(600, 800);
frame.setVisible(true);
MutableTreeNode root = new DefaultMutableTreeNode("root");
final DefaultTreeModel model = new DefaultTreeModel(root);
final JTree tree = new JTree(model);
frame.add(new JScrollPane(tree));
while (true) {
MutableTreeNode child = new DefaultMutableTreeNode("test");
model.insertNodeInto(child, root, root.getChildCount());
tree.expandRow(tree.getRowCount() - 1);
// uncommenting this to make it work
// Thread.sleep(10);
}
}
Run Code Online (Sandbox Code Playgroud)
我想将其用于打字搜索应用程序,因此提供(几乎)即时结果对我来说至关重要。
编辑:感谢您的快速解答! …
我想做一些微基准测试,并尝试做正确的.不幸的是,动态频率调整使得基准测试非常不可靠.
有没有办法以编程方式(C++,Windows)找出是否启用了动态频率调整?如果,这可以在程序中禁用吗?
香港专业教育学院曾试图在实际基准测试发生前使用100%CPU的预热阶段,但事实证明这也是不可靠的.
更新:即使我在BIOS中禁用SpeedStep,cpu-z显示频率在1995和2826 GHz之间变化
关于循环,我有一个(愚蠢的?)C/C++问题:
for (size_t i = 0; i < std::distance(begin, end); ++i) {
a.push_back(i);
}
Run Code Online (Sandbox Code Playgroud)
begin并且end是两个迭代器.我的问题是,是否std::distance(begin, end)为循环中的每个元素计算?或者使用此版本更好:
size_t dist = std::distance(begin, end);
for (size_t i = 0; i < dist; ++i) {
a.push_back(i);
}
Run Code Online (Sandbox Code Playgroud) c++ ×4
java ×3
benchmarking ×1
c# ×1
cpu-speed ×1
debugging ×1
for-loop ×1
ieee-754 ×1
jtree ×1
notation ×1
performance ×1
permissions ×1
reflection ×1
search ×1
svn ×1
swing ×1
windows ×1