我知道这是一个非常笼统的标题,但我有一些代码,令我感到奇怪的是它无法编译。
这是该问题的演示。如果您scalar_t
从更改double
为float
代码编译正常。为什么在这里不能将float提升为double?事实上,如果将常量更改为double
s ( 1.0
) 或int
s ( 1
),它们也无法提升。这不是应该起作用的事情吗?
完整代码示例:
#include <valarray>
#include <numeric>
#include <iterator>
#include <iostream>
template<typename T>
T sigmoid(const T &in)
{
return 1.f / (1.f + std::exp(-in));
}
template<typename T>
T logit(const T &in)
{
return std::log(in / (1.f - in));
}
using scalar_t = double;
int main(int argc, char **argv)
{
std::valarray<scalar_t> f = { 0.1f, 0.3f, 0.5f, 0.9f };
scalar_t alpha = 0.5f;
scalar_t beta = -1.f;
auto lC = logit(f);
std::valarray<scalar_t> skC = alpha * lC + beta;
auto sC = sigmoid(skC);
std::copy(std::begin(sC), std::end(sC), std::ostream_iterator<scalar_t>(std::cout, " "));
std::cout << std::endl;
scalar_t num = 0.7f;
auto lS = logit(num);
auto sS = sigmoid(alpha * lS + beta);
std::cout << sS << std::endl;
return 0;
}