小编mar*_*nus的帖子

将uint32_t转换为uint64_t导致不同的值?

使用Visual Studio 2015 C++,14.0.25431.01更新3.我的代码中有意外行为.使用64位编译并运行,发布:

#include <iostream>
#include <stdint.h>

int main(int, char**) {
    for (uint32_t i = 1; i < 3; ++i) {
        uint32_t a = i * 0xfbd1e995;
        uint64_t b = a;

        std::cout << a << " 32bit" << std::endl;
        std::cout << b << " 64bit" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望ab有相同的值,但是当我运行此我得到这样的输出:

4224838037 32bit
4224838037 64bit
4154708778 32bit
8449676074 64bit
Run Code Online (Sandbox Code Playgroud)

看起来编译器用64位乘法取代了32位乘法.允许这样做,还是编译器错误?g ++和clang都给了我期望的数字.

编辑:我用更简单的版本更新我的代码有相同的问题.另外,我刚刚提交了一份错误报告.

c++ 64-bit visual-c++-2015

14
推荐指数
2
解决办法
1465
查看次数

排列的好哈希函数?

我有特定范围内的数字(通常从0到1000左右).算法从该范围中选择一些数字(大约3到10个数字).这种选择经常进行,我需要检查是否已经选择了所选数字的排列.

例如,一步选择[1, 10, 3, 18]另一步,[10, 18, 3, 1]然后第二选择可以被丢弃,因为它是一种置换.

我需要非常快速地进行检查.现在我把所有数组都放在一个hashmap中,并使用一个自定义哈希函数:只需要总结所有元素,所以1 + 10 + 3 + 18 = 32,还有10 + 18 + 3 + 1 = 32.对于equals,我使用bitset来快速检查元素是否在两个集合中(我在使用bitset时不需要排序,但它只在数字范围已知且不太大时才有效).

这样可以正常工作,但是可以产生大量冲突,因此很常调用equals()方法.我想知道是否有更快的方法来检查排列?

排列是否有任何好的哈希函数?

UPDATE

我做了一个基准测试:生成0到6范围内的所有数字组合,以及数组长度1到9.有3003种可能的排列,并且应该在这么多不同的哈希值附近生成一个好的哈希值(我使用32位数字)对于哈希):

  • 仅添加41种不同的哈希(因此存在大量冲突)
  • 8个不同的哈希值用于XOR'ing值
  • 用于乘法的286种不同的哈希值
  • (R + 2e)3003个不同的哈希值和abc建议的乘法值(使用1779033703表示R)

所以abc的哈希值可以非常快速地计算出来并且比其他所有哈希值都要好得多.谢谢!

PS:我不想在不需要时对值进行排序,因为这会变得太慢.

hash performance permutation

12
推荐指数
2
解决办法
5663
查看次数

如何快速查找添加/删除的文件?

我正在编写一个小程序,它创建了我目录中所有文件的索引.它基本上遍历磁盘上的每个文件并将其存储到可搜索的数据库中,就像Unix的locate一样.问题是,由于我有大约一百万个文件,因此索引生成非常慢.

生成索引后,是否可以快速找到自上次运行以来在磁盘上添加或删除的文件?

编辑:我不想监视文件系统事件.我认为风险太高而无法实现同步,我更喜欢快速重新扫描,以便快速找到添加/删除文件的位置.也许目录上次修改日期或其他什么?

一个小基准

我刚做了一点基准.运行

dir /b /s M:\tests\  >c:\out.txt
Run Code Online (Sandbox Code Playgroud)

需要0.9秒,并提供我需要的所有信息.当我使用Java实现(很像这样)时,大约需要4.5秒.任何想法如何改善至少这种蛮力的方法?

相关文章:如何查看目录的子文件是否已更改

java filesystems file

11
推荐指数
3
解决办法
1904
查看次数

哪里可以获得西班牙语数据库< - >英语翻译?

对于我正在编写的程序,我需要一个西班牙语和英语单词之间的字典.我google了一段时间,但我找不到任何免费的数据库.有人知道在哪里或如何获得这样的数据库(最好是简单的CSV或XML文件)?

到目前为止,创建这样一个字典的最佳想法是创建一个在维基百科上查找英文单词的小程序,并使用语言链接提取正确的翻译.但是我不想仅仅为了生成这个数据库而向维基百科发出一百万个请求......

我不需要任何花哨的东西,只需要从一个单词到一个单词的映射,或者可能需要多个单词的翻译.就像一本普通的字典.

database language-agnostic translation vocabulary

9
推荐指数
1
解决办法
4951
查看次数

为什么Math.sqrt(i*i).floor == i?

我想知道这是否属实:当我取平方整数的平方根时,就像在

f = Math.sqrt(123*123)
Run Code Online (Sandbox Code Playgroud)

我会得到一个非常接近的浮点数123.由于浮点表示精度,这可能类似于122.99999999999999999999或123.000000000000000000001.

既然floor(122.999999999999999999)是122,我应该得到122而不是123.所以我希望floor(sqrt(i*i)) == i-1在大约50%的情况下.奇怪的是,对于我测试的所有数字,floor(sqrt(i*i) == i.这是一个小的ruby脚本来测试前1亿个数字:

100_000_000.times do |i|
  puts i if Math.sqrt(i*i).floor != i
end
Run Code Online (Sandbox Code Playgroud)

上面的脚本从不打印任何内容.为什么会这样?

更新:感谢快速回复,这似乎是解决方案:根据维基百科

绝对值小于或等于2 ^ 24的任何整数都可以用单精度格式精确表示,绝对值小于或等于2 ^ 53的任何整数都可以用双精度格式精确表示.

Math.sqrt(i*i)开始表现得像我预期的那样从i = 9007199254740993开始,即2 ^ 53 + 1.

ruby floating-point precision

8
推荐指数
3
解决办法
1648
查看次数

Visual C++完美转发编译错误

有什么理由不能在Visual Studio C++中编译?我正在使用Visual Studio 2017 15.7.1.它用clang和g ++编译:

#include <utility>
#include <vector>

struct Foo {
    Foo(int x) {}
    Foo(Foo const& b) {}
};

struct Bar {
    template <class... Args>
    Bar(Args&&... args)
        : foo(std::forward<Args>(args)...) {}

    Foo foo;
};

void test() {
    std::vector<Bar> v;
    v.emplace_back(123);
}
Run Code Online (Sandbox Code Playgroud)

错误是 error C2664: 'Foo::Foo(const Foo &)': cannot convert argument 1 from 'Bar' to 'int'

请参阅https://godbolt.org/g/bKb34v

编辑:我在这里提交了这个问题:https://developercommunity.visualstudio.com/content/problem/252470/perfect-forwarding-compiler-bug.html

c++ compiler-errors visual-studio-2017

8
推荐指数
1
解决办法
170
查看次数

您想要解决哪些优化问题?

我喜欢研究AI优化软件(Genetic Algorithms,Particle Swarm,Ant Colony,...).不幸的是,我已经用尽了有趣的问题需要解决.你想解决什么问题?

artificial-intelligence mathematical-optimization

7
推荐指数
2
解决办法
2999
查看次数

什么简单的数学函数f(x)具有这些属性?

我有一点数学问题.我想要一个具有这些属性的函数:

  1. 对于大于0的x:lim f(x)= x
  2. 对于远小于0的x:lim f(x)= 0
  3. 和f(0)= 1 (对不起,我在这里f(1)= 1这是错的!)
  4. f(x)应该单调递增

所以函数应该看起来像这样:

        ^
        |   /
        |  /
        | /
   ___.-+´
--´-----+------>
        |
Run Code Online (Sandbox Code Playgroud)

到目前为止我得到的最好的是x/(1 + e^(-x))然后我认识到它低于0并且没有单调增加.

使用这些功能的一个很好的帮助是GraphFunc Online.

此外,如果函数快速计算,因为我需要经常执行它,这将是有帮助的.

编辑:我在程序中使用它来限制值.我有一个优化算法,它使用Levenberg-Marquardt算法进行曲线拟合.但是这种算法不允许约束,并且优化了整个实际值范围.所以我需要一个这样的函数,这样我就可以添加一个人工约束,使函数大于0.一个简单的方法就是使用f(x) = x²但是函数不是单调递增的,它有两个最小值.

Levenberg-Marquardt近似于衍生物,所以我认为当函数也很平滑时也是如此.但我不确定这是否绝对必要.

math function

7
推荐指数
2
解决办法
2151
查看次数

C++ inplace析构函数编译警告

我在我的代码中使用了一个inplace析构函数,类似于这个被剥离的代码段:

#include <new>
#include <stdlib.h>

struct Node {
};

int main(int, char**) {
    Node* a = reinterpret_cast<Node*>(malloc(sizeof(Node)));
    new(a) Node;

    Node* b = a; 
    b->~Node(); 

    free(a);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这在Visual Studio 2015中给出了一个警告,包括Debug和Release:

warning C4189: 'b': local variable is initialized but not referenced

它在g ++中编译得很好,即使用-Wall也是如此.知道为什么我会收到警告吗?这可能是编译器中的错误吗?b显然在b->~Node()通话中使用.

当我将Node实现更改为此时,似乎编译正常:

struct Node {
    ~Node() {
    }
};
Run Code Online (Sandbox Code Playgroud)

但据我所知,这不应该有所作为.

c++ destructor compiler-warnings visual-studio visual-studio-2015

7
推荐指数
1
解决办法
197
查看次数

适用于大型c ++项目的优秀,简单的配置库?

我们正在用C++开发一个相当大的项目,其中许多组件需要配置参数.我们希望使用一个中心位置来配置所有内容(例如注册表),最好使用简单的GUI(例如Firefox about:config)和简单的API.

我很确定这很多应用程序都有这种问题,但找不到任何可用于此的库.有谁知道一个好的(最好是免费的)库用于此目的?

这应该在Windows和Linux中跨平台工作.

c++ configuration user-interface

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