void floatToDataType()

in cpp/src/array_utils.h [137:178]


void floatToDataType(const float *inputPointer, data_t *outputPointer,
                     int dimensions) {
  // Handle rescaling to integer storage values if necessary:
  if constexpr (std::is_same_v<data_t, float>) {
    if constexpr (scalefactor::num != scalefactor::den) {
      throw std::runtime_error(
          "Index has a non-unity scale factor set, but is using float32 data "
          "storage. This combination is not yet implemented.");
    }

    std::memcpy(outputPointer, inputPointer, sizeof(float) * dimensions);
  } else if constexpr (std::is_same_v<data_t, E4M3>) {
    // Re-scale the input values by multiplying by `scalefactor`:
    for (int i = 0; i < dimensions; i++) {
      outputPointer[i] = E4M3(inputPointer[i]);
    }
  } else {
    // Re-scale the input values by multiplying by `scalefactor`:
    constexpr float lowerBound = (float)std::numeric_limits<data_t>::min() *
                                 (float)scalefactor::num /
                                 (float)scalefactor::den;
    constexpr float upperBound = (float)std::numeric_limits<data_t>::max() *
                                 (float)scalefactor::num /
                                 (float)scalefactor::den;

    std::vector<data_t> output(dimensions);

    // Re-scale the input values by multiplying by `scalefactor`:
    for (int i = 0; i < dimensions; i++) {
      if (inputPointer[i] > upperBound || inputPointer[i] < lowerBound) {
        throw std::domain_error(
            "One or more vectors contain values outside of [" +
            std::to_string(lowerBound) + ", " + std::to_string(upperBound) +
            "]. Index: " + std::to_string(i) +
            ", invalid value: " + std::to_string(inputPointer[i]));
      }

      outputPointer[i] =
          (inputPointer[i] * (float)scalefactor::den) / (float)scalefactor::num;
    }
  }
}