Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926

Почему изменение параметра шаблона при вызове функции даёт неверный результат?

22.09.2018, 03:53. Показов 1563. Ответов 8

Студворк — интернет-сервис помощи студентам
Есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc.hpp>
 
    #include <iostream>
 
 
    int main(int argc, char** argv) {
 
        cv::Mat points4d = (cv::Mat_<float>(4, 1)
            << -0.16131888, 0.083065912, 0.44372728, 0.87760037);
 
        std::cout << points4d << std::endl;
 
        for (int i = 0, cols = points4d.cols; i < cols; i++) {
 
            std::cout << "points4d.at<float>(0, i): " << points4d.at<float>(0, i) << std::endl;
            std::cout << "points4d.at<float>(1, i): " << points4d.at<float>(1, i) << std::endl;
            std::cout << "points4d.at<float>(2, i): " << points4d.at<float>(2, i) << std::endl;
            std::cout << "points4d.at<float>(0, i) / points4d.at<float>(3, i): "
                      << points4d.at<float>(0, i) / points4d.at<float>(3, i) << std::endl;
            std::cout << "points4d.at<float>(1, i) / points4d.at<float>(3, i): "
                      << points4d.at<float>(1, i) / points4d.at<float>(3, i) << std::endl;
            std::cout << "points4d.at<float>(2, i) / points4d.at<float>(3, i): "
                      << points4d.at<float>(2, i) / points4d.at<float>(3, i) << std::endl;
 
            std::cout << "points4d.at<double>(0, i): " << points4d.at<double>(0, i) << std::endl;
            std::cout << "points4d.at<double>(1, i): " << points4d.at<double>(1, i) << std::endl;
            std::cout << "points4d.at<double>(2, i): " << points4d.at<double>(2, i) << std::endl;
            std::cout << "points4d.at<double>(0, i) / points4d.at<double>(3, i): "
                              << points4d.at<double>(0, i) / points4d.at<double>(3, i) << std::endl;
            std::cout << "points4d.at<double>(1, i) / points4d.at<double>(3, i): "
                              << points4d.at<double>(1, i) / points4d.at<double>(3, i) << std::endl;
            std::cout << "points4d.at<double>(2, i) / points4d.at<double>(3, i): "
                              << points4d.at<double>(2, i) / points4d.at<double>(3, i) << std::endl;
 
        }
    }
При вызове печатается следующее (для примера points4d содержит одну точку (массив 1х4)):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    [-0.16131888;
     0.083065912;
     0.44372728;
     0.87760037]
    points4d.at<float>(0, i): -0.161319
    points4d.at<float>(1, i): 0.0830659
    points4d.at<float>(2, i): 0.443727
    points4d.at<float>(0, i) / points4d.at<float>(3, i): -0.183818
    points4d.at<float>(1, i) / points4d.at<float>(3, i): 0.0946512
    points4d.at<float>(2, i) / points4d.at<float>(3, i): 0.505614
    points4d.at<double>(0, i): 1.18775e-11
    points4d.at<double>(1, i): 9.14973e-06
    points4d.at<double>(2, i): 0.00203439
    points4d.at<double>(0, i) / points4d.at<double>(3, i): inf
    points4d.at<double>(1, i) / points4d.at<double>(3, i): inf
    points4d.at<double>(2, i) / points4d.at<double>(3, i): inf
`Mat_<float>` : исходник класса можно глянуть тут.
Откуда разница в печати `points4d.at<double>` между `points4d.at<float>`?

Code
1
2
gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
OpenCV version is 3.4.3
Опции компиляции:
C++
1
-Wall -Wextra -pedantic -std=c++17
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2018, 03:53
Ответы с готовыми решениями:

Неверный тип параметра при вызове функции write потока ofstream
error C2664: std::basic_ostream&lt;_Elem,_Traits&gt;::write: невозможно преобразовать параметр 1 из 'char' в 'const char *' #include...

Программа дает неверный результат при вычислениях
Проблема в том, что программа считает неправильно, я считал с калькулятора и по формулам excel, и результат отличается от того что выдает...

Возвратить тип шаблона,так чтобы результат при вызове присваивался объекту
Есть матрица,нужно создать новую матрицу и &quot;перевернуть&quot; (т.е. столбцы становятся строками,а строки-стобцами)-это сделано. Потом нужно...

8
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
22.09.2018, 14:45
Лучший ответ Сообщение было отмечено #pragma как решение

Решение

Цитата Сообщение от #pragma Посмотреть сообщение
Откуда разница в печати `points4d.at<double>` между `points4d.at<float>`?
double в 2 раза больше float. В матрице у вас хранятся float, которые вы читаете как double. Как минимум выходите за границу массива.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 15:24
DrOffset,
А где написано что double в два раза больше float?)
Я вот в стандарте искал но не нашёл.
Нагуглил что про double в стандарте с++ вообще ничего нет
Но компиляторы реализуют его по какому то числовому стандарту где double 8 а float 4 байта...

Что ещё интересно, почему для чисел с плавающей точкой нет специальных типов фиксированного размера как например для целых вроде int32_t и т.д
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
22.09.2018, 16:15
Цитата Сообщение от Undisputed Посмотреть сообщение
А где написано что double в два раза больше float?)
Вот здесь: https://software.intel.com/sit... 64-abi.pdf
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 16:19
DrOffset,
Это же не С++ а документация для конкретной платформы... )
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
22.09.2018, 16:25
Цитата Сообщение от Undisputed Посмотреть сообщение
Это же не С++ а документация для конкретной платформы... )
И что?
Автор же написал:
Цитата Сообщение от #pragma Посмотреть сообщение
gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
22.09.2018, 16:30
DrOffset,
Наверное мне нужно было уточнить что интересует то как работать с данными если неизвестна емкость типа.
С int-ами еще понятно, можно использовать фиксированные типы вроде int32_t.
А вот что делать с double и float не понятно... По моим наблюдениям как правило float 4 байта а double 8.
Но гарантий таких я не нашел. В итоге где то вычисления могут происходить не правильно потому что на определенной платформе
размер используемого типа меньше чем это бывает обычно...
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
22.09.2018, 16:36
Цитата Сообщение от Undisputed Посмотреть сообщение
А вот что делать с double и float не понятно...
Использовать самостоятельно написанные решения или библиотечные. Например вот: https://www.boost.org/doc/libs... pdefs.html
В C++ были предложения, например вот: http://www.open-std.org/jtc1/s... /n1703.pdf

Цитата Сообщение от Undisputed Посмотреть сообщение
В итоге где то вычисления могут происходить не правильно потому что на определенной платформе размер используемого типа меньше чем это бывает обычно...
Если ты пишешь под такие платформы, то наверняка уж сумеешь разобраться как написать код так, чтобы это не было проблемой.
1
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
22.09.2018, 17:35  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
double в 2 раза больше float. В матрице у вас хранятся float, которые вы читаете как double. Как минимум выходите за границу массива.
Точно, совсем вылетело из головы. Но всё рано странно, что числа все как один стремятся к нулю, по идее должны быть некие случайные числа
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.09.2018, 17:35
Помогаю со студенческими работами здесь

Почему выводит неверный результат при вычислении произведения?
Еще 1 вопрос из разряда нубских: #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; int main() { setlocale(0,...

ChildWindowFromPoint даёт неверный результат
Есть WinForms приложение. В основном окне вызывается дочернее вот таким кодом:new RecordForm().ShowDialog(this);В этом дочернем окне...

Почему при поиске остатка числа выдает неверный результат?
Добрый вечер. Не могу понять в чем проблема. Нужно найти моду числа: double res2 = (Math.Pow(x, (n - 1) / 2)); ...

Вычисление по формуле даёт неверный результат
#include &lt;math.h&gt; #include &lt;iostream&gt; #include &lt;cstdlib&gt; double ad,bd; float af,bf; using namespace std; int main() ...

Сравнение строк даёт неверный результат
Ткните, пожалуйста, что я делаю не так? Только начал изучать ООП. Как бы я не пытался, но в классе такого вида: class Друг :...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru