gpt4 book ai didi

c++ 11:战俘的简称?

转载 作者:太空狗 更新时间:2023-10-29 23:50:49 25 4
gpt4 key购买 nike

我需要将巨大的公式粘贴到我的 C++11 代码中。这个公式包含许多东西,比如整数的 double 类型: formula

写起来很无聊:

pow(sin(B), 6) + ... pow(sin(C), 4) + ....

20次

最好的方法是为 double 和 int 重载运算符 ^,但据我所知,C++11 是不可能的。在这样的公式中:

z0^2 * (something)

根据运算符的优先级,它会是这样的:

z0 ^ (2 * (something)) 

这不是我想要的。

那么是否可以使用一些技巧来使用 C++ 代码将 x 的数学符号近似为 y 的幂?

可能的工具是:c++11 和 boost。

更新:

关于支持使用这种数学符号而不是 C++ 的代码。

我认为理想的解决方案是这样的:

const double result = (latex_mode
(sin(B_0))^6(a + b)
latex_mode_end)
(B_0, a, b);

其中 latex_mode 支持 LaTex 语言的小子集而没有歧义。1)所有接触这段代码的程序员都有数学背景,所以他们阅读 latex 没有问题2)公式可以从文章中复制/粘贴而无需任何修改,所以它会减少拼写错误。

最佳答案

不,你不能这样做。至少,你不应该。但它可以通过其他方式简化。如果你的公式可以描述为enter image description here 然后你可以制作成对的表 (a,b) 并编写自己可以完成的代码。例如:

  vector<pair<unsigned, unsigned>> table = {{1, 2}, {2, 3}, {3, 4}};
unsigned sum = 0;
for(const auto& x : table)
sum += pow(get<0>(x), get<1>(x));

受@5gon12eder 评论的启发,我写了一个函数:

template <typename Input, typename Output = unsigned>
Output powers(std::initializer_list<Input> args) {
Output result = 0;
for(const auto x : args)
result += pow(std::get<0>(x), std::get<1>(x));
return result;
}

您需要额外的(标准)库:

  1. #tuple
  2. #initializer_list

使用示例:

std::pair<unsigned, unsigned> a{1,2}, b{2,3};
std::cout << powers({a, b, {3, 4}, {4,5}}) << '\n';

打印 1114it's correct .


关于编辑部分,我可以建议写一个接收字符串和解析的函数。但是会比上面的方法慢很多。最后,您可以写信给编译器的作者。

编辑:随着 C++14 的出现,新的可能性出现了。您可以使用 for、变量等创建 constexpr 函数。因此更容易创建编译时解析器。我仍然推荐帖子原始部分的解决方案,因为它会有点困惑,但它会在编译时完成你想要的。

字符串到整数示例:

#include <iostream>


template<size_t N>
constexpr uint32_t to_int(const char (&input)[N]) { // Pass by reference
uint32_t result = 0;
for(uint32_t i = 0; i < N && input[i] != '\0'; ++i) {
result *= 10;
result += input[i] - '0';
}

return result;
}

constexpr uint32_t value = to_int("123427");

enum { __force_compile_time_computing = value };

int main() {
std::cout << value << std::endl;
}

打印:

~ $ g++ -std=c++14 -Wall -Wextra -pedantic-errors example.cpp 
~ $ ./a.out
123427
~ $

显然制作解析器会更难。可能最好的方法是使用两个构造函数 Operation(operation, operation)Operation(value) 创建 constexpr 类 Operation 并在编译时创建计算树 (如果你的字符串中有变量)。


如果你不想完成这项工作,并且你可以接受其他程序/语言语义,那么你可以实现简单的运行时解决方案。创建调用 R/mathematica/{something else} 的新线程并将输入字符串发送给它。计算后将值重新发送到主程序。如果你想要一些提示,可能使用 std::future会很方便。

关于c++ 11:战俘的简称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26415192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com