В игрушечной программе, представленной ниже, я пишу и читаю вектор двойников с потоком строк. Однако как я могу записать v как вектор (округленного) uint в ss, чтобы при чтении w вывод программы был равен 3?
#include <sstream>
#include <vector>
#include <iostream>
int main() {
std::vector<double> v = {0.1, 1.2, 2.6};
std::vector<double> w;
std::stringstream ss;
ss.write(const_cast<char*>(reinterpret_cast<const char*>(&v.at(0))), v.size() * sizeof(v.at(0))); // Here it should cast v first into uint an then into char
for(int i = 0; i < v.size(); ++i) {
double val; // It should be uint val
ss.read(reinterpret_cast<char*>(&val), sizeof(val));
w.push_back(val);
};
std::cout<<w.at(2)<<std::endl;
return 0;
}
@Yunnosch Да, это то, что я имею в виду.
Вы можете прокручивать свой вектор, округляя каждое значение по очереди, а затем записывая его в поток строк как uint. Затем вы считываете uints из потока строк, преобразуя каждый в двойной, чтобы добавить к вашему новому вектору. Трудно понять, чего еще вы ожидаете.
@john Это похоже на ответ, но как мне его реализовать?
поскольку ваши числа имеют только одну цифру после .
, вы можете хранить все числа с коэффициентом 10
и использовать целые числа вместо чисел с плавающей запятой
@Medicalphysicist Я разместил код ниже.
Предполагая, что вы хотите «округлить», как в «округлении от x.5», вы можете использовать
std::cout<<(unsigned int)(w.at(2)+0.5)<<std::endl;
Он использует смещение 0,5 для сдвига усечения и приводит к желаемому округлению.
Вывод (использования этой строки в вашей показанной программе) таков:
3
... как я могу написать (и прочитать) вектор двойников как вектор (округленный) uint...
Пожалуйста, опишите желаемый эффект (для данного образца ввода), который вы хотите увидеть, если вы «запишите (и прочитаете) вектор двойников как вектор (округленного) uint». Кажется, я неправильно понял ваш вопрос. Потому что "чтобы на выходе программы было 3" - это то, что я предлагаю здесь.
Я хочу, чтобы v была записана в ss как вектор uint. Затем, когда w читается из ss, оно должно быть w = {0, 1, 3}
Какое значение ss
вы ожидаете после того, как «v записывается в ss как вектор uint»?
Этот код считывает вектор, округляет значения и записывает их по одному. Обратное при обратном чтении из потока.
#include <sstream>
#include <vector>
#include <iostream>
#include <cstdint>
#include <cmath>
int main() {
std::vector<double> v = {0.1, 1.2, 2.6};
std::vector<double> w;
std::stringstream ss;
for(int i = 0; i < v.size(); ++i) {
uint64_t val = static_cast<uint64_t>(std::round(v.at(i)));
ss.write(const_cast<char*>(reinterpret_cast<const char*>(&val)), sizeof(val));
}
for(int i = 0; i < v.size(); ++i) {
uint64_t val;
ss.read(reinterpret_cast<char*>(&val), sizeof(val));
w.push_back(static_cast<double>(val));
};
std::cout<<w.at(2)<<std::endl;
return 0;
}
Кажется очень простым, не уверен, что еще вы могли ожидать.
Обратите внимание, что преобразование double
в uint64_t
может привести к переполнению.
Что вы имеете в виду под "округлением"? Я предполагаю, что вы имеете в виду «не усеченный, а округленный от x.5». Правильный?