增加精度的ExprTk
ExprTk with increased precision
我正试图以比long double
更精确的方式编译ExprTk库。我认为最简单的是尝试GCC的__float128
,但我得到以下编译错误,不知道如何纠正它。
exprtk.hpp: In instantiation of ‘static T exprtk::details::and_op<T>::process(exprtk::details::and_op<T>::Type, exprtk::details::and_op<T>::Type) [with T = __float128; exprtk::details::and_op<T>::Type = const __float128&]’:
exprtk.hpp:28439:10: required from ‘void exprtk::parser<T>::load_binary_operations_map(exprtk::parser<T>::binary_op_map_t&) [with T = __float128; exprtk::parser<T>::binary_op_map_t = std::map<exprtk::details::operator_type, __float128 (*)(const __float128&, const __float128&), std::less<exprtk::details::operator_type>, std::allocator<std::pair<const exprtk::details::operator_type, __float128 (*)(const __float128&, const __float128&)> > >; typename exprtk::details::functor_t<T>::bfunc_t = __float128 (*)(const __float128&, const __float128&)]’
exprtk.hpp:15660:51: required from ‘exprtk::parser<T>::parser(std::size_t) [with T = __float128; std::size_t = long unsigned int]’
mathtof.cpp:18:33: required from here
exprtk.hpp:9923:105: error: call of overloaded ‘is_true(const __float128&)’ is ambiguous
static inline T process(Type t1, Type t2) { return (details::is_true(t1) && details::is_true(t2)) ? T(1) : T(0); }
^
compilation terminated due to -Wfatal-errors.
编辑:我已经尝试实现我自己的is_true
<typename T>
inline bool is_true(const T v)
{
return std::not_equal_to<T>()(T(0),v);
}
在自定义数字类型上专门化ExprTk是相当简单的。在项目页面上有两个例子,它们提供了一个清晰而简洁的方法来引入新的数字类型。
示例如下:
- MPFR适配器
MPFR适配器建立在前面的示例之上,并展示了如何轻松地调整MPFR/GMP类型以用于ExprTk。
两个示例都附带了完整的测试套件和使用新引入的类型的基准测试。
这里有一个例子,有人把他们自己的类型叫做DScalar改成了ExprTk:
https://github.com/filiatra/gismo/blob/stable/external/exprtk_ad_adaptor.hpp在这里被使用:
https://github.com/filiatra/gismo/blob/stable/src/gsCore/gsFunctionExpr.hpp L146
应该注意的是,可以简单地使用和搜索-n-替换字符串" Real:: Type "与__float128和其他一些小的替换更改,应该都很好。
它显然不支持__float128
(gcc本身几乎不支持它,您需要Boost float128.h
库来做任何远程有用的事情)。
您可以尝试提供缺失的is_true(__float128&)
过载,它应该是相对微不足道的,但我愿意打赌,这不会是它的结束。
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 如何打印boost多精度128位无符号整数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 将 exprtk 与自定义类的对象一起使用
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 为什么输出精度没有正确舍入?
- 增加精度的ExprTk